Cook the pasta: Bring a large pot of salted water to a boil. Add macaroni and cook until just al dente according to package instructions. Drain and set aside.
Toss with a little butter or oil if you want to prevent sticking.
Brown the beef: In a large skillet or Dutch oven, cook the ground beef over medium-high heat, breaking it up as it browns. When mostly cooked, add the chopped onion and continue cooking until the onion softens and the beef is no longer pink, about 5–7 minutes.
Add garlic and seasonings: Stir in the minced garlic, paprika, black pepper, and a pinch of salt. Cook for 30–60 seconds until fragrant.
If there’s excess grease, drain it, leaving about a tablespoon for flavor.
Make the roux: Push the beef mixture to one side of the pan. Melt the butter in the empty space, then sprinkle in the flour. Whisk or stir to form a paste and cook for 1 minute to remove the raw flour taste.
Build the sauce: Slowly whisk in the milk, scraping up any browned bits.
Stir in the Dijon mustard. Bring to a gentle simmer, stirring often, until the sauce thickens slightly, 3–5 minutes.
Add the cheese: Reduce the heat to low. Stir in the cheddar and mozzarella by the handful, letting each addition melt before adding more.
Taste and adjust salt and pepper. The sauce should be smooth and glossy.
Combine with pasta: Add the cooked macaroni to the pan and fold gently until everything is coated. If using peas, stir them in now; the heat of the sauce will warm them through.
Finish and serve: Let it sit for 2–3 minutes to thicken slightly.
Sprinkle with parsley if you like. Serve hot and enjoy that creamy, beefy goodness.