Tu funcion Foro(...) es recursiva, sin filtros y cada vez que la mandas llamar vuelve a leer todos los foros.
 
Lo mas facil seria mas o menos asi (adapta las variables):   
Código php:
Ver original- // Inicializas la matriz 
-     $foro = $row['idforo']; 
-     $padre = $row['idpadre']; 
-     // Verificas si ya se creo la matriz para el $padre 
-     if(!isset($foros[$padre])) 
-         $foros[$padre] = array(); 
-     // Agregas la informacion del foro donde corresponde 
-     $foros[$padre][$foro] = $row; 
- } 
-   
- // Puedes hacer un var_dump($foros); para que veas la estructura 
- // en $foros[0] quedan solo los foros que no tienen padre (es cero) 
- // segun tu ejemplo: 
- //      $foros[0] tendra 1 => datos foro 1, 5 => datos foro 5 
- //      $foros[1] tendra 2 => datos foro 2,  4 => datos foro 4 
- //      $foros[2] tendra  3 => datos foro 3 
- //      etc... 
-   
- echo '<ul>'; 
- listar_foros(0); // Ejecutas la funcion que creara el listado, partiendo del index 
- echo '</ul>'; 
-   
- return; 
-   
- function listar_foros($padre) { 
-     global $foros; 
-     foreach($foros[$padre] as $foro => $datos) { 
-         echo '<li>'; 
-         echo "<a href=\"{$datos['link_del_foro']}\">{$datos['nombre_del_foro_']}</a>"; 
-         // Verificas si el foro tiene "hijos" 
-         if(isset($foros[$foro])) { 
-             echo '<ul>'; 
-             listar_foros($foro); 
-             echo '</ul>'; 
-         } 
-         echo '</li>'; 
-     } 
- }