Non entro nel merito dei calcoli, ma nel tuo codice non stai prendendo in considerazone il caso in cui $nr_gg sia MINORE di zero. Fose è quello il caso?

Posto il tuo codice indentato come si deve, così si capisce meglio:

codice:
public function calcola_gg($data) {
   if($data != null && !(empty($data))) {
      $data_dal = new DateTime($data);
      $data_al = new DateTime(date("Y/m/d"));
      $nr_gg = $data_dal->diff($data_al);
      $nr_gg = $nr_gg->format('%a');
      if($nr_gg >= 0 && $nr_gg < 120) {
         $pallino = '<img src="images/pallino_verde.png" width="16" height="16" align="absmiddle" />';
      } elseif ($nr_gg >= 121 && $nr_gg < 240 ) {
         $pallino = '<img src="images/pallino_giallo.png" width="16" height="16" align="absmiddle" />';
      } elseif ($nr_gg >= 241) {
         $pallino = '<img src="images/pallino_rosso.png" width="16" height="16" align="absmiddle" />';
      }
   } else {
      $pallino = '';
   }
   return $pallino;
}