Preheat the oven to 350 degrees F. Grease a 9-inch-by-13-inch ovenproof dish with 1 tablespoon of the butter.
Fill a large pot with water and place over medium-high heat. Bring to a rolling boil and season with some salt. Add the macaroni and cook until tender but still firm, 8 to 10 minutes. Drain.
Melt the remaining 2 tablespoons butter in a large skillet over medium-high heat. Then add the ginger, garlic and onions. Stir and cook until the onions are just beginning to turn golden, about 5 minutes. Add the garam masala, cumin, turmeric, paprika, cardamom, chili powder and tomatoes and cook for 5 minutes. Add the flour and a pinch of salt and pepper and stir for about 2 minutes. Slowly add the milk and continue to stir as it thickens. Cook until the sauce is thick enough to coat the back of a spoon, 15 to 20 minutes. Add 3 cups of the cheese and stir until melted.
Add the drained macaroni to the baking dish, and then pour over the cheese sauce and stir as it settles and coats all the macaroni. Sprinkle the top with the rest of the grated cheese and the breadcrumbs and bake until the top is golden and the macaroni is hot and bubbling, about 30 minutes. Serve hot.