I agree with most of what's already been said, mainly not to optimize before it's an issue, but pretending that code doesn't ever need to be optimized is just wishful thinking. Poorly thought out code will be slower, and poorly optimized code will be faster in all of the wrong places.
First, be aware of big O notation. Not in the sense of knowing the exact complexity of every one of your functions, but in the sense of making as may things as possible that happen very often
constant time operations. This is often impossible to do completely, but is very important when considering how to represent your data and choosing algorithms. This is actually far more important than micro-optimization in determining how fast your code will run. Most of the time, you can and should stop here.
Another thing is to avoid creating a large number of objects every frame. If you routinely create many large tables or large strings every frame, they can make the garbage collector work a lot. If this is your problem, you probably shouldn't try to optimize this without profiling your code. If you optimize without measuring your code, your 'improvements' could end up not doing much at all, or even making your code slower (have done this before). This could also be a sign, however, that you haven't chosen good data structures.
Next, be aware that Lua is a very flexible language, and that OO is not the only solution or even the best solution to most problems. Lua actually shows a lot of influence from Lisp and other functional languages, so understanding the power of first class functions is very helpful.
Lastly, if you're programming Lua in LuaJIT (Which LOVE is), and you need that last bit of speed to get perfect 60fps on mobile, check out LuaJIT's
FFI. You can use it to call C functions with essentially no overhead. Be careful here, though, as it is very easy to actually hurt performance here if your not careful, and/or create code that's unreadable.
A lot of what I said has been said already, but I thought I'd throw in my own two cents.