Allora.....
come prima cosa è sbagliato l'header importante: quello che ti fa apparire il prompt che ti manca.

Codice PHP:
// questo è l'header importante
header("Content-Disposition: attachment; filename=\"nomefile.csv\" ");
// io aggiungerei anche questi
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public"); 
Con questo dovresti risolvere il tuo primo problema.

Per il secondo, beh..... se scrivi print($variabile), tu stamperai sempre a video quello che è contenuto in una variabile.
Per scrivere in un file devi fare così:
Codice PHP:
$file "nomefile.csv";
$apri_il_file_da_scrivere fopen($file"w");
$scrivici_dentro fwrite($apri_il_file_da_scrivere$righe);
$chiudi_ed_invia fclose($apri_il_file_da_scrivere); 
.
Avrai notato i nomi strambi delle variabili: era per evitare di mettermi a scrivere dei commenti.

Ora un paio di segnalazioni.

1) Nel tuo script hai scritto:
header("Content-disposition: nomefile.cvs");
Se intendi creare al volo un file COMMA SEPARATED VALUES, l'estensione è CSV.

2) Ma perché un DO/WHILE? Non ti era più comodo un semplice ciclo WHILE?
Codice PHP:

while ($row_tabellamysql_fetch_assoc($tabella)) {
$righe.= "\"".$row_tabella['data_t1']."\"\t\"".$row_tabella['msisdn']."\"\t\"".$row_tabella['marcaggio']."\"\n";

Infine, l'errore che ti viene segnalato è classico di quando stampi a video prima di lanciare un header.
Suppongo che l'header che lancia il prompt di download venisse lanciato proprio dopo che tu a video stampavi il contenuto della tabella, quindi con le correzioni che ti ho segnalato non dovresti più avere problemi.
Ad ogni modo, ho scritto il codice al volo e potrebbe esserci qualche refuso.