Den Backofen auf 200°C Ober-/Unterhitze (180°C Umluft) vorheizen. Eine mittelgroße Auflaufform leicht einfetten.
Einen großen Topf mit reichlich Salzwasser zum Kochen bringen. Die Makkaroni nach Packungsanweisung al dente (bissfest) kochen. Sie sollten noch leichten Biss haben, da sie im Ofen nachgaren. Abgießen und beiseitestellen.
Während die Nudeln kochen, in einem mittleren Stieltopf bei mittlerer Hitze die 50 g Butter schmelzen. Die fein gewürfelte Zwiebel dazugeben und glasig dünsten, ca. 3-4 Minuten.
Das Mehl über die Zwiebeln streuen und mit einem Schneebesen gut verrühren. Die Mischung (Roux) unter ständigem Rühren für ca. 1-2 Minuten anschwitzen, bis sie leicht duftet. Dies verhindert einen mehligen Geschmack.
Die zimmerwarme Milch nach und nach unter ständigem Rühren mit dem Schneebesen zur Roux geben. Zuerst nur einen kleinen Schuss Milch zugeben und glatt rühren, dann den Rest langsam hinzufügen, um Klümpchen zu vermeiden. Die Sauce zum Köcheln bringen und unter gelegentlichem Rühren ca. 5-7 Minuten eindicken lassen, bis sie die Rückseite eines Löffels überzieht.
Den Topf vom Herd nehmen. Etwa drei Viertel des geriebenen Gruyère-Käses in die Sauce geben und rühren, bis er vollständig geschmolzen ist. Mit Salz, frisch gemahlenem schwarzen Pfeffer und einer guten Prise frisch geriebener Muskatnuss kräftig abschmecken.
Die gekochten Makkaroni und die Schinkenwürfel zur Käsesauce geben und alles gut vermengen, bis die Nudeln gleichmäßig überzogen sind.
Die Makkaroni-Mischung in die vorbereitete Auflaufform füllen und glatt streichen. Den restlichen Gruyère-Käse gleichmäßig darüber verteilen.
In einer kleinen Schüssel das Panko-Paniermehl mit dem einen Esslöffel geschmolzener Butter vermischen und als knuspriges Topping über den Käse streuen.
Im vorgeheizten Ofen für 20-25 Minuten backen, bis die Oberfläche goldbraun und knusprig ist und die Sauce an den Rändern blubbert. Vor dem Servieren 5 Minuten ruhen lassen.