Some tips to remember:
-Don't do button hunts, they slow down the gameplay and make things terrible for race.
-Use slopes liberally, I know they're hard to learn how to use properly (especially the 700-713 ones, they only cleanly work by doing squares) but they are the most recent addition to SRB2 and can really give the level a lot of depth.
-Test your level from each checkpoint and sit there and wait, make sure the player has enough time to react to whatever's coming at them. I know this should be obvious to most people but it's amazing how many times I've gotten killed when starting a level from a checkpoint either due to misplacement of enemies or having one set of detons right behind the player's spawn ready to kill you.
--On the same note, always put rings around the checkpoint, it should be very obvious why.
-Don't cut off a downward slope with a wall, while vanilla SRB2 doesn't increase your speed when going down a hill unless you're spinning (which locks you into the direction you're going even if you jump), some mods remove this limitation and it still feels fun to run down a slope unimpeded.
-On a similar note, if the player is going fast, adjust your turns to match. The player will slow down when turning naturally so if you give them a wide birth, they lose less momentum. In contrast, If you have a bunch of hazards coming up that the player wouldn't see when making a turn, try tightening the curve or adding an uphill slope to naturally slow the player down so they don't run into things.
-Never, EVER, put midtextures before a place where the player has to jump down over a pit. Make sure that if the player has to jump over a pit somewhere or do platforming, make absolutely sure they can see it. Fun and function always comes before aesthetics.
-Put a few secrets here and there, players like to be rewarded for their efforts for searching for things and getting to difficult areas. Don't put too many secrets around though because that will make your level too easy, distract the player, and possibly slow the pace down.
-Playtest your level with not only all three vanilla characters, but also custom ones. Including secrets that specific characters can get to is a fun way to get people to play other characters besides Sonic. Custom characters can help you notice things about your level you might not have thought about otherwise: "Is this level too difficult?" "Do I have too many/not enough monitors lying around?" "Does this one character totally obliterate everyone else's times in this stage" < (optional when it comes to custom characters), Etc.
-Always make it clear, even subtly, where the player is supposed to be going in the level. Having enemies face towards where the player will be coming from, funneling them out from other paths, and placing checkpoints before splits and after merges in paths all help the player to identify where they are even if you don't have memorable setpeices.
-Personal prefrence here, but test your stage with analog mode. Cramped corridors can make it hell for a person with this on to navigate and sometimes respawning at checkpoints will point your camera in the wrong direction.
-Another personal thing but if possible, check your level once over in the opposite rendering mode from what you use, you can run the game in OpenGL by making a new batch file (name doesn't matter), edit it and put in this line:
saving it and running it.
That's about all I've got, I'm not creative enough to design my own levels but I'd like to think I know what makes a fun one.