Vous pouvez demander à curl d'utiliser la méthode HTTP HEAD via CURLOPT_NOBODY.
Plus ou moins
$ch = curl_init("http://www.example.com/favicon.ico");
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);
De toute façon, vous n'économisez que le coût du transfert HTTP, pas l'établissement et la fermeture de la connexion TCP. Et comme les favicons sont petites, vous ne verrez peut-être pas une grande amélioration.
La mise en cache locale du résultat semble être une bonne idée si elle s'avère trop lente. HEAD vérifie l'heure du fichier, et la renvoie dans les en-têtes. Vous pouvez faire comme les navigateurs et obtenir le CURLINFO_FILETIME de l'icône. Dans votre cache, vous pouvez stocker l'URL => [ favicon, timestamp ]. Vous pouvez ensuite comparer l'horodatage et recharger le favicon.