When the server is restarted, the configuration and module initialization phases are called twice before the children are forked. The second restart is done to test that all modules can survive a restart (SIGHUP), in order to ensure that future graceful restarts will work correctly. This is very important if you are going to restart a production server.
You can control what Perl code will be executed on the start or restart by checking the values of $Apache::Server::Starting and $Apache::Server::ReStarting. The former variable is true when the server is starting, and the latter is true when it's restarting.
For example, if you want to be notified when the server starts or restarts, you can do:
<Perl> email_notify("start") if $Apache::Server::Starting; email_notify("restart") if $Apache::Server::ReStarting; </Perl>
where the function email_notify( ) (that you have to write) performs the notification. Since Apache restarts itself on start, you will get both notifications when Apache is started, and only one when it's restarted.
The startup.pl file and similar files loaded via PerlModule or PerlRequire are compiled only once, because once the module is compiled, it enters the special %INC hash. When Apache restarts, Perl checks whether the module or script in question is already registered in %INC and won't try to compile it again.
Thus, the only code that you might need to protect from running on restart is the code in <Perl>sections. But since <Perl>sections are primarily used for creating on-the-fly configurations, it shouldn't be a problem to run the code more than once.