Ragionare sul fatto che l'ereditarietà (o qualsiasi singola caratteristica, davvero) sia necessaria o meno senza considerare anche il resto della semantica della lingua è inutile; stai litigando nel vuoto.
Ciò di cui hai bisogno è una filosofia coerente nella progettazione del linguaggio; la lingua deve essere in grado di risolvere elegantemente i problemi per cui è progettata. Il modello per raggiungere questo obiettivo potrebbe richiedere o meno l'ereditarietà, ma è difficile giudicarlo senza il quadro generale.
Se, ad esempio, il tuo linguaggio ha funzioni di prima classe, applicazione di funzioni parziali, tipi di dati polimorfici, variabili di tipo e tipi generici, hai praticamente coperto le stesse basi che avresti con l'eredità OOP classica, ma usando un paradigma diverso.
Se si dispone di associazione tardiva, tipizzazione dinamica, metodi-come-proprietà, argomenti di funzioni flessibili e funzioni di prima classe, si coprono anche gli stessi motivi, ma ancora una volta, usando un paradigma diverso.
(Trovare esempi per i due paradigmi delineati è lasciato come esercizio per il lettore.)
Quindi, pensa al tipo di semantica che desideri, gioca con loro e vedi se sono sufficienti senza ereditarietà. In caso contrario, potresti decidere di gettare l'eredità nel mix o puoi decidere che manchi qualcos'altro.