Preheat and prep: Heat the oven to 375°F (190°C). Grease a 9x13-inch baking dish with a little butter or oil.
Cook the pasta: Bring a large pot of salted water to a boil.
Cook the pasta until just shy of al dente, about 1–2 minutes less than package directions. Drain and set aside.
Sauté aromatics: In a large skillet or pot over medium heat, warm the olive oil or butter. Add the onion and cook until softened, 4–5 minutes.
Stir in the garlic and cook 30 seconds until fragrant.
Make the roux: Sprinkle the flour over the onions and stir for 1 minute to cook off the raw flour taste.
Build the sauce: Slowly whisk in the milk and broth. Add the Dijon, smoked paprika, pepper, and salt. Bring to a gentle simmer, stirring, until thickened and smooth, 3–5 minutes.
Stir in cheeses: Remove from heat.
Stir in the cheddar and mozzarella until melted and silky. Taste and adjust seasoning, remembering the ham adds salt.
Combine: Add the cooked pasta, diced ham, and peas to the sauce. Fold gently to coat.
Stir in the sour cream or Greek yogurt for extra creaminess.
Transfer: Pour the mixture into the prepared baking dish and spread evenly.
Topping: In a small bowl, mix panko, Parmesan, and melted butter. Sprinkle over the casserole for a crisp finish.
Bake: Bake uncovered for 18–22 minutes, until bubbling around the edges and the topping is golden.
Rest and serve: Let the casserole rest 5–10 minutes to set. Garnish with parsley and serve warm.