Heat the olive oil in a large pot or Dutch oven over medium heat, then brown the meatballs in 2 batches for 3 to 4 minutes, turning them as needed, and move them to a paper towel-lined plate. The outside should look mostly browned, not fully cooked through, and the pot should have browned bits on the bottom that will flavor the broth.
Add the onion, carrots, and celery to the same pot and cook for about 10 minutes, stirring now and then, until the vegetables are crisp-tender. They should soften and smell sweet and mellow, with the onion turning glossy rather than browned.
Stir in the garlic, 1 teaspoon of salt or 2 teaspoons if using low-sodium broth, and ½ teaspoon black pepper, then cook for about 1 minute. The garlic should smell fragrant right away, and this is the moment when the pot starts smelling unmistakably like soup.
Return the meatballs to the pot, pour in the broth, and bring everything to a simmer over medium-high heat. The broth should bubble gently, not boil hard, so the meatballs stay tender as they finish cooking.
Stir in the pasta, lower the heat, and simmer for about 10 minutes, stirring occasionally, until the pasta is tender. The broth will turn slightly fuller from the pasta starch, and the pasta should be soft but still hold its shape.
Turn off the heat, stir in the spinach, taste, and adjust with salt and pepper if needed, then serve with grated Parmesan. The spinach should collapse within seconds from the residual heat and stay bright green instead of dull and overcooked.