Add the olive oil and butter to a soup pot or Dutch oven over medium heat. Once the butter has melted, add the onions and sauté for 5-7 minutes until softened and lightly browned.
Stir in the garlic, ground cumin, paprika, cayenne pepper, turmeric, saffron (if using), and flour. Cook for about a minute, stirring nearly constantly.
Pour in the broth. Give it a good stir to ensure the flour has dissolved and the flavorful browned bits are scraped up from the bottom of the pot.
Stir in the lentils and tomato paste, and then add the bay leaf. Increase the heat to high and bring the soup to a boil. Once it’s boiling, reduce the heat to a rapid simmer so it’s gently boiling. Simmer, uncovered, until the lentils are tender (about 10-15 minutes), stirring occasionally so that nothing sticks to the bottom of the pot.
Discard the bay leaf. Stir in the evaporated milk and simmer for another few minutes until warmed through. Using an immersion blender, blend the soup to your desired consistency (you can skip this step if you prefer a more rustic texture with the lentils intact). Stir in the chopped fresh cilantro and season generously with salt & pepper.
