Place an oven rack on the center shelf and preheat the oven to 450 degrees F. Line a baking sheet with parchment or foil.
Combine the broccoli florets with the olive oil, toss to coat evenly, then season with salt and pepper. Spread the broccoli in a single layer on the baking sheet. Roast for 18-23 minutes, using a spatula to turn the pieces over midway through. The broccoli is ready when browned and crispy on the edges and fork tender.
While the broccoli cooks, make the cheese sauce: melt the butter in medium saucepan set over medium heat. Add the flour and cook, whisking constantly, until golden and fragrant, about 1 minute. Whisk in mustard and cayenne. Slowly whisk in half-and-half and milk, then turn the heat up to high and bring to boil. Reduce heat to medium and simmer, whisking frequently, until slightly thickened, 8 to 10 minutes.
Remove the saucepan from the heat, then whisk in gruyere and cheddar in handfuls until smooth. Once the gruyere and cheddar are completely melted, whisk in the parmesan. Taste for seasoning, adding a pinch of salt and pepper if needed (you might not need any because of the parmesan and cayenne).
Transfer the broccoli to a serving platter and drizzle with cheese sauce. Serve immediately.
Notes
After it finishes cooking, the cheese sauce will develop a skin on top if left untouched. If the sauce is ready before the broccoli, give it a stir every few minutes to prevent the skin from forming.Leftovers will technically keep in the refrigerator for a few days, but this recipe is best right after cooking. The roasted broccoli loses its crunch in the refrigerator, and homemade cheese sauce might break when reheated. If you want to reheat it, do so over low heat in a saucepan, stirring constantly.