### Godot version

4.0.3 stable

### System information

Windows 10, i5 8600, RTX3060, 64 GB ram

### Issue description

In Godot 4, labels with lots of text cause scenes to load extremely slowly, both in the editor and in-game.

I measured a few game starts with different amounts of text in a label:

Text length | Game start time
-- | --
11323 | 2.33
22693 | 7.93
34064 | 19.69
45431 | 40.59

In Godot 3, the startup times for all test lengths was almost instantaneous.

The text I used was multiple copies of the license agreement for Google's [Roboto](https://fonts.google.com/specimen/Roboto) font. A "credits" page on a game could easily get well above this length.
Looking at a scatter plot with a best fit, it's pretty clearly increasing at around n^2:

![image](https://github.com/godotengine/godot/assets/8082633/6e2a9c41-f3fb-429d-acd3-288c24c6b744)

Results are the same whether I'm using the built-in font or a custom font, and results are similar across all renderers. Settings like text wrapping don't seem to affect it either.

### Steps to reproduce

Create a scene, add a label to that scene, and fill the label with a large amount of text. Try to launch the game and load that scene.

### Minimal reproduction project

[Godot3LargeLabel.zip](https://github.com/godotengine/godot/files/11521494/Godot3LargeLabel.zip)
[Godot4LargeLabel.zip](https://github.com/godotengine/godot/files/11521495/Godot4LargeLabel.zip)

for (int64_t i = lines_skipped; i < lines_rid.size(); i++) {
				total_h += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing;
				if (total_h > (get_size().height - style->get_minimum_size().height + line_spacing)) {
					break;
				}
				lines_visible++;
			}
			if (max_lines_visible >= 0 && lines_visible > max_lines_visible) {
				lines_visible = max_lines_visible;
			}
			int last_line = MIN(lines_rid.size(), lines_visible + lines_skipped);
			bool trim_chars = (visible_chars >= 0) && (visible_chars_behavior == TextServer::VC_CHARS_AFTER_SHAPING);
			bool trim_glyphs_ltr = (visible_chars >= 0) && ((visible_chars_behavior == TextServer::VC_GLYPHS_LTR) || ((visible_chars_behavior == TextServer::VC_GLYPHS_AUTO) && !rtl_layout));
			bool trim_glyphs_rtl = (visible_chars >= 0) && ((visible_chars_behavior == TextServer::VC_GLYPHS_RTL) || ((visible_chars_behavior == TextServer::VC_GLYPHS_AUTO) && rtl_layout));
			
			int total_glyphs = 0;
			total_h = 0;
			for (int64_t i = lines_skipped; i < last_line; i++) {
				total_h += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing;
				total_glyphs += TS->shaped_text_get_glyph_count(lines_rid[i]) + TS->shaped_text_get_ellipsis_glyph_count(lines_rid[i]);
			}
			int visible_glyphs = total_glyphs * visible_ratio;
			int processed_glyphs = 0;
			total_h += style->get_margin(SIDE_TOP) + style->get_margin(SIDE_BOTTOM);
			int vbegin = 0, vsep = 0;
			if (lines_visible > 0) {
				switch (vertical_alignment) {
					case VERTICAL_ALIGNMENT_TOP: {