COOK THE SPINACH (if using fresh spinach): Heat a very large, deep skillet over medium heat. Add all the spinach with the water still clinging to its leaves, you may have to firmly pack it. Cover the pan tightly (weight the lid down, if necessary). Leave the spinach to cook for about 2 minutes, then turn it over so that the wilted leaves are on the top. Cover and repeat the process a few times more, until all spinach is nicely wilted. Remove from the heat and cool to room temperature. Drain spinach and reserve the pot that you cooked the spinach inches DO NOT WASH OR WIPE CLEAN.
If you don't have a salad spinner (OR if using frozen spinach), squeeze the spinach dry with your hands a little at a time, squeezing as much liquid as possible from the leaves. Use paper towels and gently blot the spinach to help it dry. Chop the spinach leaves coarsely and set aside.
MAKE A ROUX: In a medium saucepan, melt the butter over medium heat. Stir in the flour with a wooden spoon, to make a loose paste. Cook for about 1 minute. As soon as it balls up into a paste, exchange the wooden spoon for a wire wisk and in a steady stream, whisk in the warm milk. Stir slowly, until the roux comes to a simmer, about 2 minutes, stirring continuously, until the sauce has thickened.
Add the cream, salt, and pepper, and stir for 1 minute more. Remove the pan from the heat and stir in the cheese to melt.
ONION MIXTURE: In the same skillet where the spinach was cooked, heat the olive oil over medium heat. Add the onion and garlic and saute, stirring occasionally, for about 5 minutes or until onions are translucent.
ASSEMBLY: Add the cooked spinach and the cheese sauce to the pan and stir together over medium heat until well mixed and heated through. Taste for seasoning, and transfer to a heated and covered serving dish.