Ich weiß nicht genau was ich dir dazu sagen soll, bzw. was genau deine Frage ist. Ja, es gibt ein Leben nach der imperativen Programmierung und ja, damit bekommt man durchaus auch Sachen auf die Reihe.
Generell würde ich der Aussage deines Kumpels zustimmen, auch wenn ich eventuell die Reihenfolge der imperativen Sprachen etwas ändern würde, aber das ist wie er schrieb Geschmackssache und teils einfach von der Umgebung in der das Problem gelöst werden soll abhängig (Java ist momentan wohl noch die pragmatischste Wahl für Android-Apps, C++ für entweder Systemnahes oder Performancekritisches, Python für alles andere. Wenn man das ganze vertauscht und C++ für Webapps nutzt kommt in der Regel ein Schuh raus).
Funktionale Programmierung ist in der Tat interessant und da ist Python meiner Meinung nach gar nicht so weit von Clojure entfernt (ich kann mich noch an die Aussage erinnern dass Haskell nach Python die pythonischste Sprache wäre, aber persönlich würde ich dazu eher Clojure nominieren): man kann Probleme in beiden Sprachen funktional lösen, aber der Fokus der jeweiligen Communities liegt etwas anders: Clojure mehr auf dem funktionalem, Python mehr auf dem imperativen/objektorientiertem. Das spiegelt sich dann oft an den eingebauten Datentypen, der Standardlibrary und den verfügbaren Libraries und deren APIs wieder.
(Das ist übrigens auch warum Node.js trotz all seiner Nachteile zumindest ein wenig interessant ist: das Ökosystem ist sehr auf eventbasierte Programmierung ausgelegt. Python bietet mit Twisted/Tornado/asyncio zwar ganz ähnliche Möglichkeiten, jedoch sind die Libraries meist blokierend, so dass man für rein eventbasierte Programmierung sich oft selbst sachen zusammenstöpseln muss).
Wenn man "tiefer" einsteigen will kommt man um Haskell kaum herum, ich denke dass OCaml in der Hinsicht auch keine bessere Alternative (mehr) ist. Ob es mehr synapsenfördernd ist als andere funktionale Sprachen ist wohl die Frage wie tief man einsteigen will. Haskell hat mit GHC hier den Vorteil dass die Implementation *extrem* gut gelungen ist, das ist wenn man andere Sprachen nutzt oftmals nicht so praktisch. Allerdings kann man bei Haskell durchaus auch in das bodenlose Loch der Komplexität fallen, und ob Code wie
Prickler.hs sonderlich lesbar oder verständlich ist, steht auf einem anderen Blatt.
Ich habe mir auch eine logische Programmierung angesehen, mit Prolog, aber irgendwie ist das in der Regel eher gimmicky als nützlich. Wenn man logische Programmierung nutzen will, dann wirkt auf mich das praktikabelste eine Implementation von miniKanren oder ähnliches zu nehmen und das von seiner "Hostsprache" aus zu bedienen. Die Probleme die mit logischer Programmierung sauberer lösbar sind, sind meist einfach zu selten um den kompletten Einsatz von Prolog zu rechtfertigen. Wie ich finde.
Stackbasierte/konkatenative Sprachen sind ebenfalls interessant, aber da ist die entsprechende Community leider sehr klein, so dass sich das für den Real-World-Einsatz derzeit eher nicht so eignet.
Ein interessantes Buch zu dem Thema ist
Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages, wo in 7 Wochen eine Menge Sprachen mit unterschiedlichen Paradigmen gezeigt werden. Ich hatte mir das
letztes Jahr angeschaut und auch meine Gedanken dazu gebloggt.