Brown the beef: In a large pot or Dutch oven over medium-high heat, cook the ground beef, breaking it into small pieces. Season lightly with salt and pepper.
Cook until browned and no longer pink, about 5–7 minutes. Drain excess fat if needed.
Sauté the aromatics: Reduce heat to medium. Add 1 tablespoon butter to the pot, then the onion, carrots, and celery.
Cook 5–6 minutes until softened. Stir in the garlic and tomato paste and cook 1 minute until fragrant.
Add potatoes and seasonings: Stir in the potatoes, paprika, thyme, Worcestershire sauce, and mustard. Mix well to coat the veggies and beef with the seasonings.
Pour in broth and simmer: Add the beef broth.
Bring to a boil, then reduce to a simmer. Cook uncovered for 12–15 minutes, or until the potatoes are tender when pierced with a fork.
Make a quick roux: In a small saucepan or skillet, melt the remaining 2 tablespoons butter over medium heat. Whisk in the flour and cook 1–2 minutes to remove the raw flour taste.
Slowly whisk in the milk or half-and-half until smooth and slightly thickened.
Thicken the soup: Stir the milk mixture into the pot. Simmer 3–4 minutes to let it come together and thicken.
Add the cheeses: Reduce heat to low. Stir in the cream cheese (if using) until melted.
Remove the pot from heat, then gradually add the shredded cheddar in small handfuls, stirring constantly. Keep stirring until smooth and creamy. Season to taste with salt and pepper.
Finish and serve: Ladle into bowls.
Top with chopped green onions or chives, and bacon if you like. Serve with crusty bread or a simple side salad.