Heat oven to 375°F. Grease a 9x13-inch baking dish with butter.
Warm milk and cream in a saucepan until steaming; do not boil. Set aside.
Melt butter in a large saucepan. Soften onions 3 minutes, then stir in garlic.
Whisk in flour and cook 1 minute to form a blond roux.
Gradually whisk in warm milk mixture. Simmer, stirring, until thickened and smooth.
Remove from heat. Stir in cheddar, Gruyere, half the Parmesan, thyme, paprika, salt, and pepper.
Arrange half the potatoes in the dish, slightly overlapping. Spoon over half the cheese sauce.
Layer remaining potatoes and cover with the rest of the sauce. Cover tightly with foil.
Bake 30 minutes. Uncover, sprinkle remaining Parmesan, and bake 20–30 minutes until tender and golden.
Rest 10 minutes before slicing. Garnish with extra thyme if desired.