Prep and preheat: Heat the oven to 400°F (200°C). Lightly grease a 9x13-inch casserole dish.
Peel and chop the potatoes into 1-inch chunks. Bring a large pot of salted water to a boil.
Cook the potatoes and cauliflower: Add potatoes and cauliflower to the boiling water. Cook until fork-tender, about 12–15 minutes.
Drain well and return to the hot pot to steam off extra moisture.
Sauté aromatics: While the potatoes cook, heat 1 tablespoon oil in a large skillet over medium heat. Add chopped onion and carrots with a pinch of salt. Cook 6–8 minutes until softened.
Stir in garlic and cook 1 minute.
Brown the meat: Push veggies to the side. Add remaining oil and the ground beef or turkey. Season with salt, pepper, thyme, rosemary, and smoked paprika.
Cook, breaking it up, until browned and no longer pink, 6–8 minutes. Drain excess fat if needed.
Build the sauce: Stir in tomato paste and cook 1 minute. Mix cornstarch with a splash of cold broth to make a slurry.
Add slurry, remaining broth, and Worcestershire to the skillet. Simmer 2–3 minutes until slightly thickened and glossy.
Add the greens: Stir in frozen peas and spinach (if using). Taste and adjust seasoning with more salt, pepper, or red pepper flakes.
The filling should be well-seasoned and saucy, not soupy.
Mash the top: To the hot potatoes and cauliflower, add Greek yogurt, half the shredded cheese, and a big pinch of salt and pepper. Mash until smooth and creamy. If too thick, add a splash of warm broth or milk.
Taste and season.
Assemble: Spread the meat-and-veg mixture evenly in the casserole dish. Spoon the mash over the top. Use a fork to create light ridges (they help browning).
Sprinkle with remaining cheese and Parmesan.
Bake: Bake 18–22 minutes until the top is lightly golden and the edges bubble. For more color, broil 1–2 minutes, watching closely.
Rest and serve: Let the casserole rest 10 minutes so the layers set. Garnish with chopped parsley.
Serve warm.