Crisp the bacon: In a large pot or Dutch oven, cook the chopped bacon over medium heat until crispy, 6–8 minutes. Transfer bacon to a paper towel–lined plate.
Pour off all but 1 tablespoon of the bacon fat.
Sauté the aromatics: Add the butter to the pot. Once melted, add onion, carrots, and celery. Cook, stirring, until softened, about 5–7 minutes.
Add garlic and cook 30 seconds until fragrant.
Make the roux: Sprinkle in the flour. Stir constantly for 1 minute to cook off the raw taste. The mixture will look pasty—this is your thickener.
Add liquids: Slowly whisk in the chicken broth, then the milk.
Keep whisking to avoid lumps and bring to a gentle simmer.
Add veggies and seasonings: Stir in the broccoli stems and florets, potatoes, Dijon, smoked paprika, and nutmeg. Season with 1 teaspoon salt and 1/2 teaspoon black pepper to start.
Simmer: Reduce heat to medium-low. Simmer uncovered, stirring occasionally, until the potatoes and broccoli are tender, 15–20 minutes.
Blend part of the soup: For a loaded-yet-textured feel, use an immersion blender to blend the soup partially—about 3–4 quick pulses.
You want it creamy with some chunks left. (Or transfer 2 cups to a blender, puree carefully, and return to the pot.)
Stir in the cheese: Take the pot off the heat. Gradually add the cheddar a handful at a time, stirring until melted before adding more. This prevents clumping and graininess.
Adjust seasoning: Taste and add more salt and pepper as needed.
If you like more tang, add a splash of broth or a teaspoon of apple cider vinegar to brighten.
Serve loaded: Ladle into bowls and top with crispy bacon, extra cheddar, chives, and a small dollop of sour cream. Add croutons or bread on the side if you like.