Uh!?!
Chi l'ha detto questo? Passaggio per valore e per riferimento sono due metodi per passare parametri ad una funzione/procedura. Nel primo caso viene generata una copia dell'oggetto da passare, nel secondo un riferimento ( puntatore ) all'oggetto.
Ma questo vale sia per le funzioni che per le procedure. La differenza tra le due, invece, è che le funzioni ritornano qualcosa al chiamante, le procedure assolutamente nulla. E infatti in C/C++ non esiste il concetto di procedura ( inteso come, che so, in Pascal ). Una procedura C/C++ è semplicemente una funzione void, cioè che non ritorna nulla.
Questa è la loro differenza e dovrebbe risultare chiaro quando usare le une e quando le altre. Sul come invece spezzettare un programma in tante subroutine ( funzioni o procedure che siano ) dipende da te. Nessuno vieta di scrivere un programma senza nessuna routine, poi però diventa un pastrocchio di codice illeggibile e non manutenibile.
Stesso discorso se hai pezzi di codice che vengono usati in molte parti del programma, allora vale la pena creare delle subroutine e mettere questi pezzi di codice molto usati lì dentro.
Nell'esempio che hai fatto non c'è nessun bisogno di creare delle subroutine, ma volendo potresti creare una procedura che legge tutti i numeri e li mette in un'array globale. Un'altra procedura successivamente legge l'array ed effettua le somme. Magari questa potrebbe essere una funzione e ritornare la somma.