Cook the pasta. Bring a large pot of generously salted water to a boil. Cook the elbow macaroni 1–2 minutes less than the package directs (it keeps cooking in the sauce). Drain and set aside. Don't rinse — the starch helps the sauce cling.
Make the roux. In a large saucepan or Dutch oven over medium heat, melt the butter. Whisk in the flour and cook 1–2 minutes, whisking constantly, until it smells lightly nutty and looks like wet sand.
Whisk in the milk. Gradually pour in the warmed milk, whisking constantly to prevent lumps. Bring to a gentle simmer and cook 4–5 minutes, stirring often, until the sauce thickens enough to coat the back of a spoon.
Season the sauce. Whisk in the Dijon mustard, garlic powder, onion powder, paprika, salt, and pepper.
Melt the cheeses — off the heat. Remove the pan from the heat. Add the shredded cheddar, Gruyère, and Parmesan a handful at a time, stirring until each addition melts before adding the next. Off-heat melting keeps the sauce silky instead of grainy or oily.
Combine and serve (stovetop version). Fold the drained pasta into the cheese sauce until every piece is coated. Taste and adjust salt and pepper. Serve immediately while it's gloriously creamy.
Or bake it. Transfer to a greased 9×13-inch baking dish. Toss the panko with the melted butter and sprinkle evenly over the top. Bake at 375°F (190°C) for 20–25 minutes, until bubbly and golden brown. Let it rest 5 minutes before serving.