In a large bowl, use your hands or a fork to gently combine all of the meatball ingredients. Use a tablespoon or a small scoop to shape the mixture into small meatballs. Arrange the meatballs on a baking sheet or other large tray.
Stovetop Method
In a large Dutch oven, heat 1 tablespoon of olive oil (or enough to coat the bottom of the pot) over medium-high heat. Place half of the meatballs in a single layer in the pot. Cook the meatballs until nicely browned, about 1-2 minutes per side (they do not need to be completely cooked through). Transfer the meatballs to a tray and repeat with additional oil and remaining meatballs. Set browned meatballs aside.
Leave the browned bits and drippings in the pot and heat another 1 tablespoon of oil over medium-high heat. Add the carrots, celery and onion. Cook, stirring occasionally, until soft – about 6-8 minutes. Add garlic and cook, stirring constantly, for 1 more minute. Add broth and bay leaf to the pot. Bring to a boil; then reduce heat to medium or medium-low so that the broth is simmering.
Stir in the pasta and meatballs. Cook until the pasta is tender (if using acini de pepe this will take about 10 minutes, for orzo this will be about 7-9 minutes), stirring occasionally. Remove from the heat, discard bay leaf, and stir in the spinach. The heat of the broth will wilt the spinach almost instantly. Taste and season with salt and pepper, if necessary.
Ladle into bowls and garnish each serving with chopped fresh parsley and grated Parmesan cheese, if desired.
Alternate Slow Cooker Instructions
Prepare the meatballs as instructed and pan-fry in a skillet.
Place the carrots, celery, onion, garlic and bay leaf in the bottom of a slow cooker. Add the fried meatballs on top and pour 8 cups of broth over top (this is less broth than the stovetop method, because the slow cooker adds a lot of condensation back into the soup).
Cover and cook on LOW for 4-6 hours or on HIGH for 2-3 hours, or until the vegetables are tender and the meatballs are cooked through.
During the final 15-20 minutes of cooking, stir in the dry pasta. Cover and continue cooking until the pasta is tender.
Add the spinach to the pot at the very end and stir just until the leaves wilt.
Notes
Pan-frying the meatballs before adding them to the soup is an extra step, but it's worth it! This contributes flavor and color to the meatballs, while the drippings also add an extra layer of flavor to the soup.
Cook the meatballs intwo separate batches so that they have plenty of space in the pot. This makes it easier to flip the meatballs, and it also helps them brown (rather than steam).
Fresh herbs really brighten up a warm, cozy soup. I love to garnish with fresh parsley, but other nice options include fresh dill, thyme, rosemary, basil, oregano and chives. A squeeze of fresh lemon juice is also a nice finishing touch!