I'm going to avoid a design discussion by now (although retelling Doom in the form of a kart race does interest me, like scaliano suggested in the original post). But I will offer tech commentary aside from my kart script. tl;dr - Not only do I program games for a living, but I've also worked on a game with a kart mode in it.
Track definitions
Player starts should basically be irrelevant, and boxed off somewhere. 8 map spots in each map will define actual starting positions. Players will be moved on map enter according to their current ranking. Current ranking on first race will be determined on the kart and cup select screen. All start points must be placed behind the finish line.
The actual track layout will be defined not just by level geometry. A looping path node will be created for each track. Each node must have the forward orientation of the track as its rotation. This path will be treated exactly like a curved camera path. A player's progress in the race will thus be checked with their current position versus the closet point on the spline in between the checkpoints they're currently on.
Shortcuts can be handled either in a similar way, or with a special that resets the player's position once they exit it. I'll think more on that one. Making a custom entity type with custom special parameters would be nice here, but hooking in to editor support for path nodes means you can just see the track flow in Doom Builder for example.
Anyone going off-course will thus be returned to the point on the spline that they're closest to.
Scripting guidelines
Script execution is going to be a killer for performance. Scripts should be as minimalistic as possible. The more event-based you can make your scripts instead of constantly-updating the better. The only ones that *really* need to constantly update every frame are the kart physics and the track position tracker. These scripts will be responsible for firing events at necessary times (say, for example, one player overtakes another which will require an event script to refresh the infinite-time hud message readout showing player positions).
Power ups
Best implemented as a Weapon. Allows complete user control natively. Also handles multiple powerups in one pickup natively.
Homing missiles can be intelligently made by following the track spline.
Boost
Best implemented as a PowerupGiver. Landing on a boost pad will give the player a boost item based on a PowerupGiver. Boost items collected as a power up will do a similar thing on fire - give the owner a boost item.
Kart differences
I can implement kart differences based on power output curves. Each kart will require two curves - one for normal, one for boosted.
Rubber banding
Now this is a big design point actually. At its simplest, the power output curves will be shrunk/expanded depending on your position in the race. But is that desired, or would a proper Doom-style deathmatch with everyone on equal footing be a better idea?