Let X be number of single elimination rounds needed for a given number of players (so e.g. X is 5 for 17 to 32 players). Then I would do X+2 or X+3, depending on how which side is closer to changing value of X. So 7 rounds for 12-23 players, 8 rounds for 24-47 players, 9 rounds for 48-96 players, either with no cut or (if you really want the cut) only the final match, played between leader before last round (who is removed from final swiss round) and leader after last round.
This is more or less the most that can be reasonably played in a single day, so any event with 100+ people should be played over two days - most likely playing 7-9 swiss rounds day 1, then 3 swiss rounds + final match day 2 (usually this is Sunday, so you want to avoid ending late in the evening so people have time to return home and not be very sleepy next day at work).
Finally, for biggest events (big enough that most players come by plane instead of by car, something like Worlds or Euros) I would do two full days of swiss (7-8 rounds each day) with day 3 top cut - 8 people, best-of-three for quarterfinals and semifinals, best-of-five for final match.
This is interesting idea. I wouldn’t completely rule this out, but I would first hard-code that such rematch should happen only after 2-3 rounds from the first game, and even then I’d give the pairing algorithm at least some incentive to avoid such pairings.