method_exists() does not care about the existence of __call(), whereas is_callable() does.
So if we will replace method_exists() to is_callable(), it will give much more flexibility.
For example you will able to create behaviors which magic methods (__call(), __get(), __set()) will be applied to owner too. Or even create behaviors for behaviors
I encountered with this problem, when tried to create multilangual AR behavior and versionable AR behavior (CVS) that saves data in "<ownerTableName>_revisions" and "<ownerTableName>_translations" tables.
I guess that method_exists() faster, but we need to test it.
Also if replace method_exists() to is_callable() in CController::createAction, we will able to specify additional actions for controller via behaviors.
mdomba, using of method_exist(…) && is_callable(…) will nullify all advantage of using is_callable(…), this function is self-sufficient in case of using that I propose.