Combine 1 tablespoon garam masala, 1 teaspoon kosher salt, 1 teaspoon cumin, coriander, and ½ teaspoon pepper in a large bowl. Toss the spices around to combine. Tear tofu into 1-inch pieces, add to spices and toss to coat. Add yogurt and gently toss tofu to coat; press a piece of plastic wrap against surface of tofu and transfer to refrigerator to marinate 1 hour or up to overnight.
When ready to cook, heat oven to broil (high) with rack set in upper middle position (6-inches from element). Coat a rimmed baking sheet with a drizzle of high-heat cooking oil. Transfer tofu to prepared sheet and spread into an even layer (don’t scrape yogurt off).
Broil tofu until starting to char, 20 minutes, flip and continue to broil until second side is charred, about 10 minutes. (Keep an eye on the tofu as each broiler is different.)
Meanwhile, make the sauce. Heat oil in a 12-inch satué pan over medium. Add onion and 1 teaspoon salt; cook until softened and starting to brown, 6–8 minutes, stirring occasionally.
Reduce heat to medium-low and add garlic, serrano, and ginger; cook stirring frequently 3 minutes. Stir in garam masala, cumin, and cardamom; cook 1 minute.
Add tomatoes with juices, crushing tomatoes with hands as you add them (or use your kitchen shears to cut them in can). Bring sauce to a boil over medium-high heat and cook, stirring frequently and scraping up browned bits from bottom of pan, until thickened and deep in color, about 10 minutes.
Add coconut milk and simmer, stirring frequently, until thickened, 5–7 minutes.
Add tofu to sauce, stir to coat and cook until warmed through. Serve with rice, cilantro, and naan if desired.