Bring a large pot of heavily salted water to a boil. Cook the cavatappi according to package directions until just al dente — pull it 1 minute early if anything, because it will continue softening when folded into the hot cheese sauce. Reserve half a cup of pasta water before draining.
While the pasta cooks, warm the pulled pork in a small saucepan over low heat with a splash of water to loosen it, or microwave in 30-second intervals until heated through. Stir in the BBQ sauce until the pork is evenly coated. Keep warm.
In a large saucepan or Dutch oven, melt 2 tablespoons of butter over medium heat. Whisk in the flour and cook for 1 minute, stirring constantly, until the mixture turns a light golden color and smells slightly nutty. This is your roux — it's what keeps the cheese sauce from breaking.
Slowly whisk in the whole milk and heavy cream, adding a little at a time and whisking out any lumps before adding more. Once all the liquid is incorporated, cook over medium heat, stirring frequently, until the sauce thickens enough to coat the back of a spoon — about 5 minutes.
Reduce heat to low. Add the smoked paprika, garlic powder, salt, pepper, and crushed red pepper flakes if using. Add the shredded cheddar and gruyere a handful at a time, stirring between additions until each handful is fully melted before adding the next. Do not rush this step — adding all the cheese at once can cause the sauce to seize. Taste and adjust seasoning.
Add the remaining 2 tablespoons of butter and the drained pasta to the cheese sauce. Fold gently to coat every piece of pasta. If the sauce feels too thick, add reserved pasta water a splash at a time until you reach a consistency that coats the pasta without pooling at the bottom of the bowl.
Divide the mac and cheese into bowls. Top each serving generously with BBQ pulled pork. Drizzle with extra BBQ sauce, scatter sliced green onion over the top, and serve immediately.