При embedding нет отношения «is-a». Dog не является Animal в системе типов Go — нельзя передать Dog туда, где ожидают Animal.
Методы промоутятся, но ресивер остаётся оригинальным типом — если Animal.Speak() обращается к Animal, он не знает про Dog. Нет виртуальных методов: если Dog определит свой Speak(), Animal.SomeOtherMethod() всё равно вызовет Animal.Speak(), а не Dog.Speak().
Embedding — это делегация (has-a), синтаксический сахар для поля без имени. Полиморфизм достигается через интерфейсы.