Heat butter 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. This is an important flavour-building step, don't rush it!
Add garlic and ginger and cook until fragrant, about 1 minute. Stir in garam masala, paprika, cinnamon and salt; cook 1 minute more. Add tomatoes and almonds; 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. Gently stir in paneer and cook until heated through, about 2 minutes. Top with cilantro and additional almonds, if desired.