Il fatto che la session_start() debba essere la PRIMA istruzione è una cosa semplificata: anche io lo dico spesso, per far in modo che gli utenti non sbaglino. Per utenti un tantino più avanzati, la risposta sarebbe che va prima di qualsiasi output HTML. (quindi echo, die(), o codice html, o simili).
Quindi, se includi altre pagine prima, devi assicurarti che queste non stampino nulla.
Per le altre variabili, puoi benissimo aggiungere altri elementi nell'array $_SESSION[] tranquillamente. Non fai nessun casino e non rischi nulla
Ciao!
EDIT:
a questo punto diciamola tutta: le funzioni che vanno a modificare l'header della pagina, devono essere eseguite prima di qualsiasi output HTML: una pagina HTML (o PHP) arriva al browser in 2 pezzi: la prima è l'header (che non ha nulla a che vedere con <head>), mentre la seconda è il corpo (dove c'é l'HTML {e quindi <head>, <body>....). Nell'header sono specificati molti parametri. Se invii dei dati del corpo della pagina, il browser che riceve i dati capisce che l'header è terminato, quindi inizia a "popolare" il corpo. Se poi vuoi ri-modificare i dati dell'header, non puoi più perché è già stato inviato.
Le principali funzioni che soffrono di questo problema sono header(), setCookie(), session_start() {che usa i cookie}.
Fortunatamente c'é un'ottima funzione, headers_sent() che dice se l'header è stato inviato. Quindi puoi fare anche una cosa del tipo:
Codice PHP:
if(header_sent())
echo 'Non posso invocare la session_start(), perché l\'header è già stato inviato!';
else session_start();
Infine, volendo, puoi anche bufferare l'output alla pagina con le funzioni ob_*