Melt the butter in a large Dutch oven or soup pot over medium heat.
Add the diced onion and shredded carrots. Cook for about 5 minutes, stirring often, until the onion is soft and the carrots begin to tenderize.
Add the minced garlic and cook for 30 seconds, stirring constantly, until fragrant.
Sprinkle the flour over the vegetables. Stir continuously for 1 minute to create a roux and cook away the raw flour taste.
Slowly pour in the milk while whisking or stirring constantly until smooth. Add the chicken broth or vegetable broth and stir well.
Stir in the Dijon mustard, salt, black pepper, and smoked paprika, if using.
Add the chopped broccoli florets. Bring the soup to a gentle simmer, then reduce the heat to medium-low.
Simmer for 12 to 15 minutes, stirring occasionally, until the broccoli is tender and the soup has thickened.
For a smoother texture, use an immersion blender to blend a small portion of the soup. Leave plenty of broccoli pieces intact.
Reduce the heat to low. Stir in the freshly shredded cheddar cheese one handful at a time until melted and smooth.
Stir in the half-and-half, if using. Warm gently for 1 to 2 minutes without boiling.
Taste and adjust salt and black pepper. Serve immediately with extra cheddar cheese, black pepper, croutons, or chopped parsley.