This whole thread belongs in user development, not FreeBSD development, since we're discussing the API for user-space programs here. I presume you're talking about user space processes ... if not, please explain what you're talking about.
In Unix, people typically call them "programs", or "process", not application. But that means the same thing, the user-space process that has one PID.
2) Application does SYSCALL to the driver;
What do you mean by driver? You don't syscall into a "driver", you syscall into the kernel.
If you actually mean driver (in the sense of a device-specific part of the kernel, like the ada disk driver or some USB driver), which one? There are dozens.
And: which system call are you worried about? There are dozens or hundreds. Usually, people identify system calls by their name, like "read" or "brk" or "mmap".
3) Driver allocating resources;
For lack of knowing what you mean by "driver", and which system call you mean, this is a bit hard to answer.
As gpw928 already hinted at: Any resource allocated to a user process will be automatically freed when the process exits.
4) Application received SIGKILL;
Well, that happens, and there is nothing you can do about it; sigkill will definitely kill the program. That's its purpose.
5) Application was killed and did not do SYSCALL to driver;
I don't understand. In 2 you said that it the system call was done, now you're saying it was not. Maybe you are talking about a different call here?
6) Driver did not release allocated resources.
See above. A process that is gone does not hold any resources.
The question is still there, any ways to subscribe to scheduler events, to be notified that user application with certain PID terminated and resources could be released?
Actually, there is a way to get notified when a process exits. Start the process from another process, then in the parent process put a handler on SIGCHLD, which is sent whenever the "status" (running or not running, exit code, ...) of a child process changes. Then, reap the child process and collect its exit code with a wait() call. But if you are just worried about releasing resources, that's just not necessary.