Preheat the oven to 375 degrees F. Grease an 8×8 inch baking dish.
In a large skillet, melt 2 tablespoons of the butter over medium-low heat. Add the onions with a pinch of salt and cook, stirring occasionally, until they are golden and caramely, about 40 minutes.
Bring a pot of salted water to a boil and cook the pasta according to the directions, reducing the cook time by 1 minute. Drain and set aside.
In a large pot, melt the remaining 4 tablespoons butter over medium-high heat. Add the flour, whisking until combined to create a roux. Cook for 1 to 2 minutes until it’s golden and fragrant. Slowly pour in half the milk, whisking constantly so they mixture can thicken, about 5 minutes. Slowly pour in the other half of the milk and whisk until thickened. Reduce the heat to low and add the gruyere and swiss and all but 2 tablespoons of the parmesan. Stir with a large wooden spoon until the cheese melts. Stir in the paprika, cayenne, nutmeg, mustard and any salt and pepper to taste. Stir in the cooked pasta and the onions.
Transfer the mixture to a baking dish and top with the panko crumbs and remaining parmesan. Bake until the top is golden and crunchy, about 25 minutes. Cook for a few minutes before serving.