Prepare the Meatball Mixture: Add the ground beef, breadcrumbs, egg, garlic, Parmesan cheese, Italian seasoning, parsley, salt, and black pepper to a large bowl. Mix gently until the ingredients are just combined, being careful not to overwork the meat.
Shape the Meatballs: Using slightly damp hands, shape the mixture into small, evenly sized meatballs. Place them on a plate or tray while preparing the soup.
Brown the Meatballs: Heat the olive oil in a large Dutch oven over medium heat. Add the meatballs in batches and cook until lightly browned on the outside, turning gently as needed. They do not need to be fully cooked yet.
Sauté the Vegetables: Remove the meatballs from the pot and add the diced onion, carrots, and celery. Cook until the vegetables begin to soften, then add the minced garlic and cook briefly until fragrant.
Build the Broth: Add the diced tomatoes, beef broth, Italian seasoning, and bay leaf. Stir well and bring the mixture to a gentle simmer, scraping up any flavorful browned bits from the bottom of the pot.
Return the Meatballs: Carefully return the browned meatballs to the simmering broth. Reduce the heat and cook gently until the meatballs are cooked through and the vegetables are tender.
Add the Greens: Stir the fresh spinach into the soup and cook for a few minutes, just until the spinach wilts. Check that the meatballs have reached a safe internal temperature of 165°F.
Finish and Serve: Remove the bay leaf and stir in the fresh parsley. Add lemon juice if desired and taste the soup, adjusting salt and black pepper as needed. Ladle into bowls and serve warm.