The GNU Compiler supports since several releases a unofficial C feature called "Label as Values":http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html. This feature offers the ability to retrieve the address of a label and use it in a unconditional branch construct. foo, bar and hack are labels:

static void *array[] = { &&foo, &&bar, &&hack };
[...]
goto *array[i];

The saved condition comes with its one costs: this form is not simple to read compared to simple switch/case statements, especially in real world examples. Anyway this feature offers the ability to get rid of some CPU cycles by substitute the conditional branch. A really nice employment for Label as Values are interpreters, the following code fragment illustrate this:

static int interpret(Opcodes opcodes) {
  static const void *codetable[] =
      { &&RETURN, &&INCREMENT, &&DECREMENT, &&DOUBLE };
  int result = 0;

  goto *codetable[*(opcodes++)];

  RETURN:
   return result;

  INCREMENT:
   result++;
   goto *codetable[*(opcodes++)];

  DECREMENT:
   result--;
   goto *codetable[*(opcodes++)];

  SWAPWORD:
   result = (result << 16) | (result >> 16);
   goto *codetable[*(opcodes++)];
}

I found this example on the bugzilla site for llvm (http://llvm.org/bugs/show_bug.cgi?id=3120).

llvm support this language feature since some time but internally implemented it using a switch table. So no performance gains are expected for LLVM. Sidenote, LLVM internal generated switch tables where often superior to the hand crafted switch/case counterpart. This changes over time and llvm now supports full Label as Values support, current values depending on the architecture are quite impressive. To sum up: interpreted switch is almost always faster on all workloads - exception: llvm on x86_64. The duel between GCC and llvm are quit variable, depending on the architecture, if switched or threaded and so on.

I looked at the Berkely Packet Filter (http://lxr.linux.no/#linux+v2.6.34/net/core/filter.c) implementation at the Linux kernel but the current structure allows no straight forward modification of the code. Labels are currently compile time calculated bit expressions.