In a large bowl, combine ground beef (or pork), breadcrumbs, egg, milk, Worcestershire sauce, onion powder, garlic powder, salt, and black pepper. Mix just until combined. Roll mixture into small meatballs about 1-inch in diameter. You should get approximately 20-24 meatballs.
Heat a large skillet over medium heat and add a drizzle of oil. Working in batches, brown meatballs for 4-5 minutes, turning occasionally until golden on all sides. They don’t need to be fully cooked through yet since they’ll finish cooking in the soup. Transfer to a plate and set aside.
In a 5-6 quart pot or Dutch oven, melt butter over medium heat. Add diced onion, carrots, and celery. Cook for 5-7 minutes, stirring occasionally, until vegetables soften and onion becomes translucent.
Sprinkle flour over vegetables and stir continuously for 1-2 minutes until mixture looks slightly golden. Gradually pour in beef broth, whisking constantly to eliminate lumps.
Bring soup to a simmer and add nutmeg, salt, and black pepper.
Gently add browned meatballs to pot along with egg noodles (or diced potatoes). Continue simmering for 10-12 minutes until noodles are tender and meatballs reach internal temperature of 160°F. Note: If using diced potatoes, increase simmering time to 15-20 minutes. Keep simmer gentle to prevent meatballs from breaking apart.
Stir in heavy cream and cook for additional 2-3 minutes until heated through. Taste and adjust seasoning with more salt and pepper if needed.
Ladle soup into bowls and garnish with fresh chopped parsley if desired. Serve hot.
Notes
You can substitute egg noodles with diced potatoes for a heartier option. Potatoes need 15-20 minutes of simmering versus 10-12 for noodles.
For thicker soup, add more flour to the roux or use a cornstarch slurry. Don’t overwork the meatball mixture to keep meatballs tender.
Vegetarian version: Use plant-based meatballs or chickpeas. Dairy-free: Use coconut milk and skip the butter.
You’ll need a 5-6 quart pot or Dutch oven for this recipe.