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 