Marinate the chicken. In a large bowl, mix yogurt, ginger-garlic, salt, garam masala, cumin, coriander, chili powder, turmeric, and lemon juice. Add chicken and toss to coat well. Marinate 20 minutes at room temp or up to overnight in the fridge.
Rinse and soak the rice. Rinse basmati in cool water until the water runs mostly clear. Soak in water for 15 minutes, then drain.
Parboil the rice. Bring a large pot of water to a boil. Add salt (aim for pleasantly salty water), bay leaves, and optional whole spices (cardamom, cinnamon). Add drained rice and boil until the grains are about 70 to 80% cooked, usually 4 to 8 minutes. Trust the texture more than the timer: the grain should bend, but still have a firm, chalky center. Drain well.
Make saffron milk. Stir saffron into warm milk or water and set aside. If using turmeric instead, whisk it into the warm liquid.
Build the masala base (and your onion topping). In a heavy pot or Dutch oven, heat 2 tablespoons of the ghee over medium heat. Add sliced onion and cook, stirring often, until deep golden brown, 10 to 15 minutes.
Scoop out about 1/3 of the onions onto a plate or bowl for topping later. These reserved onions are your main "fried onion" layer if you are not using store-bought fried onions.
Add cumin seeds and optional green chiles to the pot and cook 30 seconds. Add tomato and cook until reduced and glossy, 4 to 8 minutes. You may see a little oil at the edges when it is ready.
Cook the chicken. Add the marinated chicken to the pot and stir to coat in the masala. Cover and cook over medium-low until the chicken is mostly cooked, 15 to 25 minutes for bone-in (less for boneless), briefly uncovering once halfway to stir, then re-cover.
Doneness cues: the thickest part should reach 165°F/74°C and the juices should run clear. Before you layer, the masala should look saucy, not dry. If it looks tight, add 1/4 to 1/2 cup water or stock to keep things steamy and happy.
Layer the biryani. Turn heat to low. Spread the chicken mixture into an even layer. Add the parboiled rice on top without stirring it in.
Top with reserved onions, cilantro, mint, and drizzle with saffron milk. If using store-bought fried onions, scatter them on top now for extra crunch. Drizzle the remaining 1 tablespoon ghee or oil over the rice. Dot with 1 tablespoon butter or ghee if using.
Steam (dum) to finish. Cover with a tight lid. Cook on the lowest heat for 20 to 25 minutes. Aim for gentle steam and a quiet sizzle. If your stove runs hot, use the smallest burner, slide a heat diffuser under the pot, or choose the oven method below for steadier heat.
Burn-prevention tip: if you smell anything sharp or smoky, move the pot off the heat for a minute to calm it down, then return to very low.
Rest off heat for 10 minutes before opening.
Optional oven finish: After layering, bake covered at 350°F for 20 minutes, then rest 10 minutes.
Fluff and serve. Use a spoon to gently lift and mix from the sides, bringing chicken up through the rice. Serve with lemon wedges and raita.
