Heat olive oil in a large pot or Dutch oven over medium heat. Add chopped onion, carrots, and celery. Sauté for 5-7 minutes, until vegetables are softened and onions are translucent. Add minced garlic and cook for another minute until fragrant.
If using beef stew meat, add it to the pot and brown on all sides. If using ground beef, add it and cook, breaking it up with a spoon, until browned. Drain off any excess grease if using ground beef.
Pour in beef broth, diced tomatoes (undrained), tomato paste, Worcestershire sauce, lemon juice, dried thyme, and bay leaf. Stir well to combine, scraping up any browned bits from the bottom of the pot. Season with salt and freshly ground black pepper to taste.
Bring the soup to a simmer, then reduce heat to low, cover, and let simmer for at least 45 minutes to 1 hour, or longer for richer flavor. The longer it simmers, the more the flavors will meld together.
While the soup simmers, make the roux. In a separate small saucepan, melt butter over medium heat. Gradually whisk in flour and cook, stirring constantly, for 2-3 minutes, until the roux is smooth and lightly golden. Do not let it burn.
Gradually whisk the hot roux into the simmering soup, a little at a time, stirring constantly to prevent lumps. Simmer for another 15-20 minutes, or until the soup has thickened to your desired consistency.
Taste the soup and adjust seasoning as needed. Remove the bay leaf. Ladle hot soup into bowls and garnish with chopped hard-boiled eggs and fresh parsley. Serve hot, with a splash of dry sherry on the side, if desired.