Heat oil over medium heat in a large saucepan or dutch oven. Add onions and slowly cook until golden, about 20 minutes, reducing heat if they are getting crispy or browning quickly.
Add garlic and cook until fragrant, about 1 minute. Stir in garam masala, paprika, cinnamon and salt; cook 1 minute more. Add tomatoes; cook 2 minutes, then add cream and carefully puree using an immersion blender (or standing blender, but do it in batches or the steam will blow the top off).
Return sauce to saucepan and bring to a simmer. Remove chicken from marinade and it to the sauce (discarding remaining marinade). Cover, and simmer over medium-low heat until cooked through, about 12 minutes (remove a couple of pieces to make sure they are no longer pink inside). A gentle simmer is required to gently cook the breasts so they don't become tough, and you don't want to overcook them.
Stir in butter, taste and add more salt to taste. Serve sprinkled with cilantro, if desired.