Prep your broccoli. Steam or roast florets until bright green and tender-crisp.
Set aside while you make the sauce.
Warm the milk. In a small saucepan or microwave, gently heat the milk until warm to the touch. Warm milk blends smoother and helps prevent lumps.
Make the roux. In a medium saucepan over medium heat, melt butter. Sprinkle in the flour and whisk for 1–2 minutes until it smells toasty and looks like wet sand. Don’t let it brown too much.
Add the milk slowly. While whisking constantly, pour in the warm milk in a slow stream.
Keep whisking until the mixture is smooth and starts to thicken, about 3–5 minutes.
Season the base. Whisk in Dijon, garlic powder, a pinch of salt, pepper, and cayenne or paprika if using. The sauce should be silky and just thick enough to coat the back of a spoon.
Lower the heat and add cheese. Reduce heat to low. Add the cheddar in small handfuls, whisking between additions until melted.
Stir in Parmesan if using. Do not boil after adding cheese; gentle heat keeps it smooth.
Taste and adjust. Add more salt or pepper if needed. If it’s too thick, whisk in a splash of warm milk. If too thin, let it simmer on low for a minute, whisking.
Serve. Spoon the sauce over hot broccoli or toss to coat.
Finish with a grind of black pepper or a sprinkle of paprika.