Though there are times when I am tempted to use it instead of more "sophisticated" programming techniques... I mean, which is easier to read:
Old-Style Quick & Dirty Gotos
code:
foreach (Array innerArray in outerArray)
{
  foreach (Item i in innerArray)
  {
    if (i == target)
    {
      foundit = true;
      goto done;
    }
  }
}
done:
"Sophisticated" Procedural Programming Workaround
code:
foreach (Array innerArray in outerArray)
{
  foreach (Item i in innerArray)
  {
    if (i == target)
    {
      foundit = true;
      // can't break out of more than one loop at once without a goto!
      break;
    }
  }
  // so I have to check again in each loop level to avoid wasting time searching for something I already found!
  // not too annoying with only 2 levels, but with more... 
  if (foundit == true)
    break;
}
OK, that wasn't the best example (when was the Last time you had more than 3 levels of nested loops anyway?  
 ) but there ARE times when a goto would come in handy, but I couldn't make myself touch it for fear of being shunned for life  