As what you are really trying to do is replace a system call by your own function, I would recommend using kprobes for this kind of job, you can easily break on any kernel address (or symbol (e.g., sys_exit and sys_whateversyscall) and alter the execution path, all of this at runtime, with a kernel module if you need to :) It has a very low overhead.
Kprobes (or jprobes if you only to add your code to the system call as opposed to replace it completely) work by dynamically replacing an instruction (e.g. first instruction of your system call entry) by a break (e.g., int3 on x86). Inside the do_int3 handler, a notifier notifies kprobes, which in turn passes the execution to your registered function, from which point you can do almost anything.
A very good documentation is given in Documentation/kprobes.txt so as a tiny example in file samples/kprobes/kprobes_example.c (in this example, they break on do_fork to log each fork on the system). It has a very simple API and is very portable nowadays.