1: It's not possible. My idea was that it should be easy to reuse the same room layouts with a different tileset, so rooms are hardcoded to only use one tileset. (This is also why the tileset layout is forced to be the same for every tileset for collision checking purposes) I guess it might've been a mistake.
2: In the script config_quickclone_features, at the bottom. You provide the starting level, and the pixel X / Y coordinates.
3: The player will snap to whatever door is the closest to the edge of the screen you entered from, measured from the center of the map grid cell you moved to, so it's possible to have more than one sideways door from one room to another, but it's a bit finicky if they're placed too close to each other - as a rule of thumb you can only have one door per map cell of each type [=background, left, right, up, down].
(Map cells are indicated in the room editor, so hopefully this shouldn't be too hard to deal with.)
The world map data is used to connect levels - when you go through a door, the player is moved to whatever level is on the adjacent cell on the map. So rooms that are next to each other in the world map editor will be connected... but only if you place a door in them in the level editor. It's a bit disorienting at first, but the nice part is that the doors connect completely automatically.
4: Editing init_player_classes to add more lines of data should be everything you need, the character creation menu reads from this data when it is constructed. If you add/remove classes (instead of just changing the default classes) you also need to update the macro PLAYERCLASS_MAX to match the new value, since that is how many entries the menu reads. There's a handful of other places where the player class data is used (status and file select menu displays the name of the character's class) but these should also "just work" since they read from the same data array.