In a large pot or Dutch oven, melt butter over medium heat. Add the onions and cook for 3 to 4 minutes, until they begin to soften. Sprinkle the flour over the onions and stir to combine, cooking for about 1 minute. Slowly whisk in the milk and half-and-half.
Add the nutmeg, broccoli, a dash of salt, and lots of freshly ground black pepper. Cover and reduce the heat to low. Simmer for 20 to 30 minutes, or until the broccoli is tender. Add the cheese a handful at a time, stirring to melt the cheese after each addition.
At this point I did a quick pass with my immersion blender on low to blend up the broccoli a bit, but still leave a good amount of texture. You could also choose to mash it with a potato masher to break up the broccoli a bit, or transfer to a blender or food processor in two batches and puree completely. Finally, whisk in the vegetable broth, and re-warm over low heat, then serve.
Notes
I like using mild cheddar cheese so that it doesn't overpower the rest of the soup, but you can certainly use sharp if you prefer. If you are into Velveeta broccoli cheese soup (old school solidarity!), then you can substitute that for the cheddar cheese.
If you cannot find half and half where you live, simply substitute heavy cream and whole milk in equal parts.
You can substitute chicken broth or stock for the vegetable broth.
Make a crockpot broccoli cheese soup by transferring the milk mixture, broccoli, seasonings, and cheese to the slow cooker after step #1. Cook on low for 4 to 6 hours, then proceed with mashing/pureeing the soup as you'd like and whisk in the vegetable broth as directed.
If you like potatoes in your broccoli cheese soup, add some cubed potatoes along with the broccoli in step #2.