Blanch the Spinach: Bring a large pot of salted water to a boil. Add fresh spinach leaves and cook for 1–2 minutes until wilted. Immediately transfer to ice water to stop cooking and preserve color. Drain well and squeeze out excess moisture using a potato ricer, towel, or your hands.
Prepare the Roux: In a large skillet, melt butter over medium heat. Add finely diced red onion and sauté until soft and fragrant. Stir in the flour to form a roux, cooking for about 2 minutes while stirring constantly to avoid burning.
Make the Cream Sauce: Gradually whisk in warm whole milk, one cup at a time, to create a smooth béchamel. Continue whisking until the sauce thickens slightly. Add a pinch of salt, pepper, optional hot sauce, and garlic if desired. Reduce heat to low.
Incorporate Spinach: Fold the drained spinach into the cream sauce. Mix thoroughly until the spinach is evenly coated and the sauce has a creamy consistency.
Add Cheese and Lemon: Stir in cheddar and Gruyère cheese, reserving a little for topping. Mix until fully melted, then add lemon juice and zest for a bright finish. Adjust seasoning to taste.
Bake and Serve: Transfer to a buttered baking dish or ramekins. Sprinkle with remaining cheeses and Parmesan. Bake at 375°F (190°C) for 15–20 minutes until bubbly and golden brown. Garnish with fresh parsley and serve warm.
