I've actually been thinking about an OnKeyframe callback for years now. But it was mostly for mixing purposes that might be better solved in other ways. I suspect that it's easy to add, actually, if you're familiar with how the runtime works under the hood.
But adding it in as part of the official runtime might not be the best idea since not a lot of people need it. An extra null check and possible method call per keyframe probably wouldn't scale well.
As for your use, OnKeyframe might not be what you need.
(1) Custom Events
Do you mean apart from the Events you can define in the editor? http://esotericsoftware.com/spine-events
What did you mean by "Custom Events"?
(2) Determining "frame number"
If you meant to get the current frame number when an event fires, you can do that this way:
// this returns the current time in the current animation in seconds.
// this is a bit unsafe since GetCurrent(0) can return null if no animation is playing. You can add a null check.
float myTimeElapsed = mySkeletonAnimation.state.GetCurrent(0).time;
// this is now the time elapsed converted to frames. You can Mathf.Floor it or convert it to an int to get a whole number.
float myCurrentFrame = myTimeElapsed / 30f;