Cook the pasta in salted water according to package directions until al dente. Drain and set aside.
In a large skillet over medium-high heat, melt the butter with the olive oil. Add the chicken pieces in a single layer and cook until browned and cooked through, about 5–7 minutes. Remove the chicken from the skillet and set aside.
In the same skillet, reduce heat to medium. Add the diced onion and cook until softened, about 4–5 minutes. Stir in the garlic and ginger and cook for 30 seconds until fragrant. Add the garam masala, paprika, cumin, coriander, turmeric, salt, pepper, and cayenne, stirring constantly for about 1 minute to toast the spices.
Stir in the tomato sauce and tomato paste, then pour in the chicken broth. Bring to a gentle simmer and cook for 8–10 minutes, allowing the sauce to thicken slightly. Reduce the heat to low and stir in the heavy cream and Greek yogurt until smooth.
Return the cooked chicken to the skillet and simmer for another 5 minutes so the flavors combine and the chicken is heated through. Stir in the Parmesan cheese if using.
Add the drained pasta directly to the skillet and toss until well coated in the sauce. If the sauce is too thick, add a splash of pasta water or additional broth to loosen it.
Garnish with chopped cilantro before serving.