Brown the beef: Heat a large pot or Dutch oven over medium-high.
Add the ground beef and cook, breaking it up, until browned and no longer pink, about 6–8 minutes. If the beef is very lean, add a tablespoon of oil to help it sear.
Drain excess fat: If there’s a lot of grease, spoon out most of it, leaving about a tablespoon in the pot for flavor.
Sauté the aromatics: Add diced onion, carrots, and celery. Cook, stirring, until softened, 5–7 minutes.
Add the garlic and cook 30 seconds, just until fragrant.
Boost the tomato flavor: Stir in the tomato paste and cook for 1–2 minutes. This step caramelizes the paste slightly and deepens the flavor.
Add tomatoes and broth: Pour in the crushed or diced tomatoes and the beef broth. Stir in the bay leaf, Italian seasoning, and smoked paprika if using.
Bring to a gentle boil.
Simmer: Reduce heat to a steady simmer. Cook uncovered for 15 minutes to let the flavors come together. Taste and adjust salt and pepper.
Add starch (optional): If you want pasta or rice, stir it in now.
For small pasta, simmer another 8–10 minutes. For rice, simmer 12–15 minutes, until tender. Add a splash of broth if the soup thickens too much.
Balance and finish: If the tomatoes taste sharp, add 1 teaspoon sugar or a splash of balsamic to round it out.
Remove the bay leaf. Stir in chopped parsley or basil if you like.
Serve: Ladle into bowls and finish with cracked black pepper and a sprinkle of Parmesan. Warm bread on the side is never a bad idea.