Which part of service contracts are costly? ACS service contract stores implementation details in the database, but it creates a Tcl command for each implementation on startup, so there isn't any database overhead to call a service contract while running.
If you want to use callbacks I don't see a need to create another mechanism to define them.
I think the issue is deciding if there are clear places where a callback makes sense. We don't want to end up with a callback for every function in the core.