Boil the pasta: Bring a large pot of salted water to a boil. Cook the pasta until just shy of al dente (about 1 minute less than the package time). Drain and set aside.
Sauté aromatics: In a large skillet, heat olive oil over medium.
Add onion and cook 3–4 minutes until soft. Stir in garlic and cook 30 seconds until fragrant.
Add ham and peas: Toss in the diced ham and peas. Cook 2 minutes to warm the ham and take the chill off the peas.
Build the sauce: Pour in milk and chicken broth.
Stir in Dijon, black pepper, and smoked paprika. Bring to a gentle simmer.
Melt in cheese: Lower heat, add shredded cheese and cream cheese (if using). Stir until smooth.
Taste and add salt only if needed.
Combine with pasta: Add the drained pasta to the skillet. Stir so everything is coated. If it looks thick, splash in a bit more milk or broth.
Make the topping: In a small bowl, mix breadcrumbs with melted butter until evenly moistened.
Finish under the broiler (optional): If your skillet is oven-safe, sprinkle breadcrumbs over the pasta and broil 1–2 minutes until golden.
If not, toast breadcrumbs in a dry pan and sprinkle on top before serving.
Garnish and serve: Top with parsley. Serve hot, with a squeeze of lemon if you like brightness.