Bring a large pot of salted water to a boil. Add the elbow macaroni and cook according to package directions until al dente. Drain the pasta and set aside.
Make the Cheese Sauce
In the same pot (or a saucepan), melt the butter over medium heat. Whisk in the flour and cook for 1-2 minutes, stirring constantly, until it forms a smooth paste (roux).
Gradually whisk in the milk, a little at a time, ensuring no lumps form. Continue to cook and stir until the sauce thickens and coats the back of a spoon.
Remove the pot from the heat. Stir in the shredded cheddar cheese and Gruyere cheese until completely melted and smooth. Season with salt, pepper, and paprika.
Combine and Serve
Add the cooked pasta to the cheese sauce and stir until well combined and the pasta is evenly coated.
Serve immediately. Optional: top with extra cheese or breadcrumbs.
Notes
For an extra creamy texture, use whole milk. You can also add other cheeses like Monterey Jack or Colby for a different flavor profile.