Keep in mind that a compiler like SBCL will put Lisp performancewise in the range of other statically compiled language/implementations.
> 2) puts steep memory requirements on top of performance costs
Such that the Dylan IDE ( https://news.ycombinator.com/item?id=14478942 ) written in Macintosh Common Lisp needed 20 MB RAM. Steep memory requirements! Current Lisp implementations run nicely on a first-gen Raspberry Pi.
Lisp fought with memory efficiency in the 80s (the Lisp Machine operating systems ran in 20 MB RAM + 100MB virtual memory -> which were 4 MWords RAM of 40bit memory), but hasn't grown much since then. The jump to 64bit implementations has brought some size increase. But the size varies widely between large machine code (say with SBCL), space efficient byte code implementations (CLISP) and tiny executables created by whole-program compilers like mocl.
> 4) Huge runtime which is embedded in every executable, that makes it less competitive with scripting languages
If you want to compete with 'scripting languages', then just don't include the runtime. You can use many Lisp implementations just like scripting languages.
> Lisp requires eval() and runtime interpretation which other languages optimize out and replace with fixed code paths
If a compiler is used (say: SBCL, ECL, LispWorks, GCL, CCL, Allegro CL, mocl, ...) , then Lisp does not require runtime interpretation.
> some external programs called "tree shakers" remove the lisp's runtime
They don't. Treeshakers remove unused code and data. Parts of the runtime are still there.
> 5) Any piece of data can be potentially executed at runtime
If you remove the compiler & interpreter from the executable, that can't happen. See for example the LispWorks documentation on 'Delivery':
http://www.lispworks.com/documentation/lw70/DV/html/delivery...
> since lisp code/data are intermingled.
Not necessarily. Code in compiled Lisp implementations is machine code. If all fails, you can always compile Common Lisp to C code using GCL, ECL, MKCL, mocl, CLASP (C++).
> Lisp is so far removed from any concept of safety it even allows the programs to be modified at runtime
Only if you include an interpreter.
Actually one of the nice features of many Lisp implementations is that usually all data is tagged and that Lisp code checks applicability at runtime, incl. array/string/vector bounds checks...