Prep the broccoli. Cut the florets into bite-size pieces.
Peel the tough outer layer of the stems and dice the tender cores. This reduces waste and adds extra flavor.
Sauté the aromatics. In a large pot or Dutch oven, heat the olive oil and 2 tablespoons of butter over medium heat. Add onion, carrot, and celery with a pinch of salt.
Cook 5–7 minutes until softened and fragrant. Stir in the garlic for 30 seconds.
Make the roux. Add the remaining 2 tablespoons of butter to the pot. Sprinkle in the flour and stir constantly for 1–2 minutes.
You want a light blond color and a nutty smell, not browning.
Whisk in the broth. Slowly pour in the broth while whisking to avoid lumps. Add broccoli stems and half the florets. Bring to a gentle simmer and cook 8–10 minutes, until the stems are tender.
Add the milk. Reduce the heat to medium-low and stir in the milk or half-and-half.
Add Dijon, nutmeg, and a few grinds of black pepper. Do not boil after adding dairy; keep it just below a simmer.
Cook the remaining florets. Add the rest of the broccoli florets. Simmer gently 5–7 minutes, until bright green and just tender.
This gives you a mix of textures.
Blend for creaminess. Use an immersion blender to partially blend the soup, leaving some pieces intact. Or transfer 2–3 cups to a blender, blend until smooth, and return it to the pot. Adjust thickness with more broth or milk if needed.
Season and add cheese off heat. Turn off the heat.
Gradually stir in the cheddar by the handful until melted and smooth. Taste and season with salt and pepper. If you like brightness, add a small squeeze of lemon.
Serve. Ladle into warm bowls.
Garnish with a little extra shredded cheddar, cracked pepper, and a drizzle of olive oil if you like. Serve with toasted bread, garlic croutons, or a simple green salad.