Gentilissimo!!
Ho provato subito il tuo script e funziona, anche se con la mia tabella non ottengo proprio il risultato sperato
ma ti ringrazio comunque perché i tuoi consigli mi sono serviti a risparmiare qualche riga di codice, ecco lo script finale
Codice PHP:
<select name="provincia">
<option value="0" disabled="disabled">Seleziona una provincia</option>
<?php
include "connessione.php";
$sql="SELECT *
FROM `regioni_province`
ORDER BY `denominazione_regione` ASC;";
$risultato = @mysql_query($sql,$connessione);
if (!$risultato) {
die ("errore: lettura del db non riuscita.");
}
$rows = mysql_num_rows($risultato);
$rows_counter = 0;
$regione_precedente = "ABRUZZO";
?>
<optgroup label="<?php echo $regione_precedente; ?>">
<?php
while ($rows_counter < $rows)
{
$row = mysql_fetch_row($risultato);
$rows_counter++;
$id = $row[0];
$regione = $row[1];
$provincia = $row[2];
$sigla_auto = $row[3];
if ($regione != $regione_precedente)
{
?>
</optgroup>
<optgroup label="<?php echo $regione; ?>">
<option value="<?php echo $sigla_auto; ?>"><?php echo $provincia." (".$sigla_auto.")"; ?></option>
<?php
$regione_precedente = $regione;
}
else
{
?>
<option value="<?php echo $sigla_auto; ?>"><?php echo $provincia." (".$sigla_auto.")"; ?></option>
<?php
}
}
mysql_close($connessione);
?>
</select>
adesso è senz'altro più leggibile di prima 
ma tu come hai strutturato la tabella? La mia è strutturata così
codice:
CREATE TABLE `regioni_province` (
`id_provincia` tinyint(4) NOT NULL auto_increment,
`denominazione_regione` varchar(30) NOT NULL,
`denominazione_provincia` varchar(30) NOT NULL,
`sigla_automobilistica` varchar(2) NOT NULL,
PRIMARY KEY (`id_provincia`)
);
Mi sai dire perché non va con il tuo esempio? Sennò non importa, avrei risolto, mi bastava ottimizzare un po' il codice