intendevo così:

Codice PHP:
<?php
// così la prima regione è l'Abruzzo
$sql1=mysql_query("
    SELECT *
    FROM regioni_province    
  ORDER BY denominazione_regione ASC;"
); 
$conf "Abruzzo";
// apro la select ed il primo optgroup
echo '<select name="provincia">';
echo 
'<option value="0" disabled="disabled">Seleziona una provincia</option>';
echo 
'<optgroup label="Abruzzo">';

while (
$rmysql_fetch_array($sql1)) {

$regione $r["denominazione_regione"];
// controllo che se regione è diverso al valore di confronto.
if ($regione!=$conf) {
echo 
'</optgroup><optgroup label="'.$r["denominazione_regione"].'">';
     }
    echo 
"<option value='" .$r["denominazione_provincia"] . "'>" .$r["denominazione_provincia"] . "</option>";
// aggiorno il valore di confronto per il prossimo ciclo
$conf $r["ripartizione_geografica"];
    }
    
// a fine ciclo chiudo l'ultimo optgroup e la select
echo "</optgroup></select>";
?>
ho fatto una prova con una mia tabella e mi ha dato l'output giusto. Una sola query, codice veloce
ho cercato di rimettere i tuoi nomi di variabili, colonne e tabelle, non so se mi è sfuggito qualcosa