Правильно ли сравнивать генераторы, промисы и async/await?
Сначала были Промисы и девелопер понял что это хорошо. Но девелопер задумался, а можно ли перестать писать then().then()... Но async\await еще не было, тогда девелопер взял функцию генератор смешал с промисом и родилось - co Это выглядело немного страшненько (имхо), но хайп был, который наплодил много статей почему это спасение - порой слог был такой уверенный, что вводил в заблуждение. А потом появились async\await - которые промисы, но без then().then(). Промисы это промисы, их надо понять в любом случае. Зная промисы, async\await понимается быстро и полностью.Генераторы (то что вы имеете в виду) это самописный сахар для реализации async\await  подобного поведения до того как появился  async\await. Т.е. это не реализация языка, а просто код обертка.Async\await - это уже реализация языка, которая основана на промисах.
Генераторы - это одно, промисы/async/await - другое. Генератор по сути - функция, которая запоминает свое внутреннее состояние (1, 2, 3). Генераторы нужны для создания "сложных" последовательностей.
Async/await (1, 2) задуманы как альтернатива промисам, т.к. промисы хоть и решают проблему callback hell, но все равно сложны для чтения. При этом async/await все еще экспериментальный функционал, поэтому без Babel тут не обойдешься (который собственно сведет async/await к промисам).