Melt 2 tablespoons butter over medium heat in a large pot. Add your diced onion and cook until it's soft and turning golden, about 5 minutes. Stir in the minced garlic and let it get fragrant—you'll smell it immediately, which is your cue to move forward.
Sprinkle 1/4 cup flour over the onion and garlic mixture, stirring constantly for about 1 minute. This creates your base and prevents lumps from forming later. Don't skip this step because it's what gives the soup that naturally thick texture everyone loves.
Pour in 3 cups chicken broth slowly while whisking to break up any flour lumps. Bring the mixture to a simmer over medium-high heat, stirring occasionally. It'll go from cloudy to clear-looking as it thickens up, which takes about 5 minutes.
Add your 3 cups broccoli florets directly into the simmering broth. Let them cook uncovered for 8 to 10 minutes until they're tender but still bright green. Don't overcook them or they'll turn into mush—I learned that the hard way after walking away for too long.
Pour in 1 cup milk and 1 cup heavy cream, stirring gently to combine everything. Heat until small bubbles form around the edges—this is when you know it's about ready for the cheese. Never let it boil hard or the cream can break.
Remove the pot from heat and add 1 cup shredded cheddar cheese, 1 teaspoon salt, 1/2 teaspoon pepper, and 1/4 teaspoon nutmeg. Stir until the cheese completely melts and you've got that gorgeous creamy base throughout. Taste and adjust seasonings because everyone's preference is different.
If you prefer a smoother broccoli cheese soup recipe, use an immersion blender to puree it partially or fully. I keep mine slightly chunky so you get texture, but that's totally up to you. Let it cool for 2 minutes before serving because it's genuinely hot.