Melt the butter in a large Dutch oven or soup pot over medium heat.
Add the onion and cook for 4 to 5 minutes until softened. Stir in the garlic and cook for another 30 seconds.
Sprinkle the flour over the onions and stir constantly for about 1 minute to form a roux.
Gradually whisk in the chicken broth until smooth.
Add the milk and heavy cream, whisking continuously.
Stir in the broccoli, shredded carrots, Dijon mustard, smoked paprika, salt, and black pepper.
Bring the soup to a gentle simmer and cook for 15 to 20 minutes, stirring occasionally, until the broccoli is tender.
Use an immersion blender to blend part of the soup if you prefer a thicker, creamier texture while leaving some broccoli pieces intact.
Reduce the heat to low.
Gradually stir in the cheddar cheese and Parmesan until completely melted and smooth.
Taste and adjust the seasoning if needed.
Serve hot with extra shredded cheddar and crusty bread.