Sauté the aromatics: Melt the butter in a large pot over medium heat. Add onion and carrots with a pinch of salt. Cook 5–6 minutes, stirring, until softened.
Stir in garlic and cook 30 seconds until fragrant.
Make the roux: Sprinkle in the flour. Stir constantly for 1–2 minutes to cook off the raw flour taste. The mixture should look like a thick paste.
Add liquids gradually: Slowly whisk in the broth, a little at a time, to prevent lumps.
Once smooth, whisk in the milk. Bring to a gentle simmer.
Simmer with broccoli: Stir in broccoli, Dijon, nutmeg, salt, and pepper. Reduce heat to medium-low.
Simmer 12–15 minutes, stirring occasionally, until broccoli is very tender and the soup thickens.
Adjust texture: For a chunkier soup, leave as is. For a smoother texture, use an immersion blender to partially blend, leaving some pieces intact. Blend more for a creamier finish.
Add the cheese off heat: Turn off the heat.
Stir in cheddar (and Parmesan, if using) by the handful, mixing until fully melted and smooth. Taste and adjust salt and pepper.
Serve: Ladle into bowls. Garnish with extra cheese, chives, or red pepper flakes.
Pair with warm bread or a bread bowl.