Sauté the aromatics: In a large heavy-bottomed pot over medium heat, melt the butter. Add diced onion and cook until translucent, about 4 minutes. Add minced garlic and stir until fragrant (about 30 seconds).
Make a light roux (optional): Stir in the flour and cook for 1–2 minutes, stirring constantly, until golden and nutty. This step thickens your soup base.
Add liquids and simmer: Gradually whisk in the vegetable broth, milk, and cream (if using). Stir constantly to avoid lumps. Bring to a gentle simmer.
Add broccoli: Add the chopped broccoli and simmer uncovered for 10–12 minutes, or until tender but not mushy.
Blend or keep chunky: Use an immersion blender to puree the soup partially or fully, depending on your texture preference. Or leave it rustic and chunky.
Add cheese off-heat: Turn off the heat and slowly stir in cheddar and parmesan. Mix until completely melted and silky smooth.
Taste & finish: Season with salt, pepper, and paprika/cayenne. Serve hot with crusty bread or a grilled cheese on the side.