Prep the broccoli: Cut the florets into small, bite-size pieces. Peel tough broccoli stems, then dice the tender core.
Set aside.
Sauté aromatics: In a heavy pot, melt the butter over medium heat. Add onion (and carrot, if using) with a pinch of salt. Cook 5–6 minutes until soft and slightly golden.
Stir in garlic and cook 30 seconds until fragrant.
Make the roux: Sprinkle in the flour. Stir constantly for 1–2 minutes to form a paste and cook off the raw flour taste. The mixture should look thick and slightly foamy, not browned.
Add liquids: Slowly whisk in the broth, a splash at a time, to avoid lumps.
Then whisk in the milk or half-and-half. Bring to a gentle simmer.
Season and simmer: Add ground mustard, a pinch of nutmeg, black pepper, and 1/2 teaspoon salt. Stir in the broccoli.
Simmer uncovered 10–12 minutes, stirring occasionally, until broccoli is tender and the soup thickens slightly.
Optional blend: For a creamier texture, use an immersion blender to pulse 3–4 times, leaving plenty of chunks. Or transfer 1–2 cups to a blender, blend smooth, and return to the pot.
Add the cheese: Reduce heat to low. Add cheddar by the handful, stirring after each addition until fully melted before adding more.
Taste and adjust salt and pepper.
Finish and serve: Add a pinch of red pepper flakes if you like gentle heat. Ladle into bowls and top with extra cheddar or a crack of black pepper. Serve with warm bread.