La tua soluzione funziona ma non consiglierei a nessuno di metterla in pratica visto che è assai pericolosa.
Per restare sul sicuro bisogna in qualche modo controllare se la pagina effettivamente esiste... secondo me lo switch è la soluzione migliore. Volendo si potrebbero popolare i case con una query, no? Per esempio

Codice PHP:
$p = isset($_GET['page']) ? trim($_GET['page']) : ''
$page $db->query("SELECT `page` FROM `pages`");
switch(
$p) {
   while (
$pag $db->fetchNextObject($page)) {
      case 
$pag:
         include_once 
"$pag.php";
         break;
   }
   default:
   include_once 
'error404.html';

Non so se si può fare, non ho mai provato un approccio di questo genere, ma sicuramente anche uno switch potrà essere generato dinamicamente... lascio la parola ai più esperti