Line a colander with 2 layers of cheesecloth and set in the sink. Bring milk to boil in a large pot over medium-high heat, stirring occasionally to prevent scorching. Let it boil 30 seconds (remove from heat if it starts to boil over) and stir in 1/4 cup lemon juice. Milk will curdle, separating into cheese curds and a clear yellow whey. Pour into cheesecloth-lined colander.
Rinse curds with cold water. Pull up edges of the cheesecloth, gently squeeze out as much water as possible, and form curds into a 6-in. disk. Put cheesecloth-wrapped disk on a large plate, top with a large cutting board, and weigh down with a heavy pot. Put in the refrigerator and let press at least 3 hours and up to overnight.
Meanwhile, bring a large pot of water to boil. Fill a large bowl with ice water and set aside. To boiling water, add 3 tsp. salt and the spinach. Cook 1 minute, then drain and transfer spinach to ice water. Swirl around to cool spinach and drain again. Use your hands to squeeze water from spinach. Set aside.
In a blender, whirl garlic, onions, chiles, ginger, and 1/4 cup of water to make a paste. Set aside.
In a medium pot over medium-high heat, add oil, cardamom, cloves, bay leaves, and cinnamon. Cook until spices darken, about 2 minutes. Add reserved onion paste. Cook, stirring occasionally, until mixture thickens and darkens, about 15 minutes. If the mixture starts to stick, add 1 tbsp. of water at a time, stirring, to help loosen it.
Stir in coriander, cumin, and turmeric. Cook until fragrant, about 2 minutes. Add tomato and yogurt. Cook until thickened slightly, about 3 minutes. Stir in spinach and remaining salt. Turn heat to low and cover. Cook, stirring occasionally, until flavors are blended, about 30 minutes.
Cut paneer into 1/2-in. cubes and gently stir into spinach mixture. Cook until paneer is heated through, about 2 minutes. Add garam masala and remaining lemon juice. Adjust salt and lemon juice to taste. Serve hot, with flatbread or rice.
Note: Nutritional analysis is per serving.