Preheat and prep: Heat your oven to 375°F (190°C). Grease a 9x13-inch baking dish or similar casserole.
Cook the bacon: In a large skillet over medium heat, cook the chopped bacon until crisp, about 6–8 minutes.
Transfer to a paper towel–lined plate. Reserve 1 tablespoon of bacon fat in the skillet, discard the rest.
Toast the topping: Add the panko to the skillet with the reserved bacon fat and 1 tablespoon butter or oil. Stir over medium heat for 2–3 minutes until lightly golden.
Set aside and toss with 2 tablespoons grated Parmesan and a pinch of salt.
Boil the pasta: Bring a large pot of salted water to a boil. Cook the pasta to very al dente, 1–2 minutes less than the package suggests. Drain and set aside.
Make the roux: In a large pot or Dutch oven, melt 3 tablespoons butter over medium heat.
Whisk in the flour and cook, whisking, for 1–2 minutes until it smells nutty and looks smooth, without browning too much.
Add the dairy: Slowly whisk in the milk, then the cream if using. Keep whisking to prevent lumps. Simmer gently for 3–5 minutes until the sauce thickens enough to coat a spoon.
Season the base: Whisk in Dijon, onion powder, garlic powder, smoked paprika, 1 teaspoon salt, and 1/2 teaspoon pepper.
Taste and adjust. The sauce should be well-seasoned at this stage.
Stir in the cheeses: Reduce heat to low. Add cheddar and Gruyère in small handfuls, whisking until melted and smooth.
Stir in the remaining Parmesan. If the sauce gets too thick, splash in a bit more milk.
Combine pasta and bacon: Fold the pasta and most of the bacon into the cheese sauce. Reserve a little bacon for topping.
The mixture should be creamy and slightly loose.
Transfer and top: Pour everything into the baking dish. Sprinkle the toasted panko over the top, then the reserved bacon.
Bake: Bake for 18–22 minutes, until bubbling around the edges and the top is golden brown. Rest for 5–10 minutes before serving so it sets up slightly.
Garnish and serve: Add chives or scallions for a fresh finish.
Serve warm.