The world doesn't really start with main(). It's a dirty lie fed to you by 'Da Man'. But the startup code is one of the ugliest parts of getting a micro project up and running (arduino has an audience because it hides all of that).
The startup code does two critical things... and will usually do a lot more very useful things as well...
1) It defines the vector table. This is a list of addresses the micro will jump to on events (like reset).
2) It defines the very first code to run after a reset (the code at the reset vector). This usually clears the RAM, sets up the stack and heap etc, and for it's last action will call main().
That's when your project will start. So the startup code is fairly essential.
IDE's are pretty good now at generating all the startup code for your project automatically. And if your lucky, you'll never have to worry about it (I've never been that lucky ), just leave it in your project.