Heat the oven to 325 degrees F, then grease a 3 qt baking dish (9x13"). Set the dish aside so the pasta and sauce can go straight into a prepared pan.
Boil the elbow pasta in a large pot of salted water until it is 1 minute less than the package al dente time, then drain it and add a light drizzle of olive oil. The noodles should still feel firm in the center and separate easily instead of sticking together.
Shred the cheddar and Gruyere, toss them together, and divide the mixture into three portions: about 3 cups for the sauce, 1 1/2 cups for the middle, and 1 1/2 cups for the top. Mixing the cheeses first gives each layer the same cheddar-and-Gruyere balance.
Melt the butter in a large saucepan over medium heat, whisk in the flour, and cook for approximately 1 minute while whisking often. The roux should look like a glossy, damp paste and develop a faint nutty aroma without browning deeply.
Whisk in about 2 cups of the half and half gradually, then whisk in the remaining half and half and the whole milk in a slow stream. Keep whisking until the sauce is completely smooth with no floury lumps around the edges of the pan.
Cook the dairy mixture over medium heat, whisking very often, until it becomes very thick. It should resemble condensed soup loosened slightly with milk and should cling heavily to the whisk.
Take the saucepan off the heat, stir in the salt, pepper, paprika, and 1 1/2 cups of the cheese mixture, then add another 1 1/2 cups and stir until smooth. The sauce should become glossy and velvety as the cheese melts, with no oily sheen on top.
Combine the drained pasta and cheese sauce in a large mixing bowl, then spread half into the baking dish, add 1 1/2 cups of cheese, and cover with the remaining pasta. The middle cheese layer creates stretchy pockets throughout the finished casserole.
Scatter the final 1 1/2 cups of cheese over the top and bake for 15 minutes. Take it out when the cheese is bubbling around the edges and the surface is lightly golden brown.