Per questioni di portabilità non solo verso sistemi diversi da Windows ma anche tra versioni di Windows differenti; per questioni di performance, perché ogni chiamata alla system() crea un nuovo processo dell'interprete dei comandi; per questioni di comodità, perché spesso la costruzione della linea di comando richiede chiamate a sprintf che non servirebbero usando funzioni "normali" e perché la system non ti dà alcun feedback sul risultato dell'operazione; per questioni di chiarezza, perché le chiamate alla system() tendono a diventare dei mostri illeggibili; per questione di comodità dell'utente, che si può vedere degli avvisi del firewall o di altre applicazioni di sicurezza che lo avvertono che il tuo programma ne sta lanciando un altro (cmd.exe o command.com su Windows).
Anche se la maggior parte di queste considerazioni non si applica per una semplice system("pause");, resta il fatto che il linguaggio ci fornisce già i mezzi per ottenere lo stesso effetto senza richiamare eseguibili esterni, e che è consigliabile (per le ragioni esposte prima) abituarsi a non usare la system().