The best way to do it depends on the code you've got and how you need to interact with it.
- NIF: As fast as a function call, but any problems in the Lisp code have the potential to crash the Erlang VM
- Shell: Probably the least amount of work for you and well-isolated, but very expensive to invoke. If you're invoking Lisp only a few times a minute, do this one.
- TCP or other socket: Well-isolated, fast (slower than NIF, though). Having your Lisp code available as a service might be nice in other ways. Requires a bunch of writing.
- LFE: You have to rewrite your Lisp code. LFE is not Common Lisp, so you can't just recompile.