Make the meatballs: In a large bowl, combine all the meatball ingredients and gently mix with your hands, just until everything comes together. (Overmixing = tough meatballs, and no one wants that.) Roll into small ¾-inch balls and set aside on a tray.
Brown the meatballs (optional, but adds great flavor): Heat a drizzle of olive oil in a large pot and brown half the meatballs on all sides. They don’t need to be fully cooked yet. Remove, then repeat with the remaining batch.
Build the soup base: In the same pot, add a little more olive oil and sauté the onion, carrots, and celery for 5–7 minutes, until softened and fragrant. Add garlic, if using, and cook for another 30 seconds.
Add the broth and simmer: Return the browned meatballs to the pot and pour in the chicken broth. Bring to a boil, then reduce to a gentle simmer. Cook for 10–15 minutes, until the meatballs are fully cooked and tender.
Add the pasta and greens: Stir in the pasta and cook according to the package directions (usually 6–8 minutes). During the last few minutes, add the chopped greens and let them wilt down into the soup. (If you’re using baby spinach, no need to chop.)
Finish and serve: Taste and adjust the seasoning with salt, pepper, and a squeeze of lemon juice to brighten everything up. Ladle into bowls, sprinkle with Parmesan and parsley, and serve warm.