Ситуация, в которой есть смысл сравнивать эти инструкции — проверка на соответствие множеству взаимоисключающих условий.
if else
Обрабатываются все условия методично, друг за другом.
switch
Каждый 
case — точка входа в блок инструкций.
Если сравнивать быстродействие, то 
webkit покажет почти одинаковые результаты, в 
Gecko производительность выше у 
switch, но не кардинально (на 20-30%), что не принципиально.
А вот логика у этих инструкций разная. Это заметно, если для некоторых значений требуется выполнить одни и те же инструкции. В этом случае написанные подряд 
case могут быть удобней, чем составная проверка в 
if. Кроме того, после выполнения входа выполнение инструкций продолжается либо до инструкции 
break, либо до окончания инструкции 
switch. И тут у 
switch появляются дополнительные возможности.
Следует также учесть, что в инструкции 
switch выполняется проверка с учётом типа (===), что отличает её от 
if, в которой проверяться может хоть приведённое значение (==), хоть чёрт в ступе. Значения 
case должны представлять собой примитивы (выражения, в результате выполнения которых подставляются примитивы).
Пример ifif (x === 'a') {
	//Только для 'a'
} else if (x === 'b' || x === 'c' || x === 'd') {
	//Только для 'b', 'c', 'd'
} else {
	//Для остальных
}
Пример switchswitch (x) {
	case 'a':
		//Только для 'a'
		break;
	case 'b':
	case 'c':
	case 'd':
		//Только для 'b', 'c', 'd'
		break;
	default:
		//Для остальных
}
А вот такое возможно только с использованием 
switchswitch (x) {
	case 'a':
		//Только для 'a'
	case 'b':
		//Только для 'a', 'b'
	case 'c':
	case 'd':
		//Только для 'a', 'b', 'c', 'd'
		break;
	default:
		//Для остальных
}