Start the potatoes: Place peeled, cubed potatoes in a large pot and cover with cold, salted water.
Bring to a boil, then simmer 12–15 minutes until fork-tender.
Sauté aromatics: In a large skillet, heat oil or butter over medium heat. Cook the onion 4–5 minutes until soft and lightly golden. Add garlic and cook 30 seconds.
Brown the beef: Add ground beef to the skillet.
Season with a pinch of salt and pepper. Cook, breaking it up, until browned with some crispy bits on the edges, about 6–8 minutes. If very fatty, spoon off excess grease, leaving about a tablespoon.
Build flavor: Stir in tomato paste and cook 1 minute to caramelize.
If using mushrooms, add now and cook 3–4 minutes until they release moisture and brown.
Make the roux: Sprinkle flour over the beef and stir to coat. Cook 1–2 minutes to remove raw flour taste.
Add liquids and season: Gradually pour in beef broth while stirring. Add Worcestershire, soy sauce (if using), thyme, and paprika.
Bring to a simmer and cook 5–8 minutes until the gravy thickens and looks glossy. Adjust salt and pepper. If using peas, stir them in for the last 2 minutes.
Finish the mash: Drain the potatoes well.
Return to the warm pot and let steam off for a minute. Mash with butter, warm milk, and sour cream (if using). Season generously with salt and pepper.
Aim for creamy but not soupy.
Optional richness: For an extra-luxe gravy, stir in a splash of cream at the end. Taste and tweak seasoning so it’s bold and savory.
Serve: Spoon a generous mound of mashed potatoes into bowls. Ladle the beef and gravy over the top.
Finish with chopped parsley or chives.