Bring a large pot of salted water to a boil and cook the elbow macaroni for 1-2 minutes less than the package instructions for al dente; drain and set aside.
In a large saucepan or Dutch oven, melt the butter over medium heat until foaming.
Whisk in the flour and cook for approximately 2 minutes, stirring constantly, to create a blonde roux without browning.
Gradually whisk in the whole milk, a little at a time, and continue to whisk until the sauce is smooth and thickened enough to coat the back of a spoon.
Remove the pan from the heat and stir in 3 cups of the cheddar cheese and all 2 cups of the gruyere cheese until fully melted and smooth.
Stir in the salt, black pepper, smoked paprika, and garlic powder.
Fold the cooked macaroni into the cheese sauce until every noodle is thoroughly coated.
Transfer the mixture into a greased 9x13 inch baking dish and sprinkle the remaining 1 cup of cheddar cheese over the top.
Bake in a preheated oven at 350 degrees Fahrenheit (175 degrees Celsius) for 20 to 30 minutes until the cheese is bubbling and the top is lightly golden.