These are widely used, so why not doing them as C primitives and corresponding bytecodes? It shouldn't be too hard to tweak byte-opt.el to optimize (car (cdr X)) -> (cadr X) etc., and so emit new bytecodes. Dmitry