You can execute the call the following way (members of addresses, abi.encode*, low-level calls):
Example 1: Call using already calculated function signature (this answers your question)
bytes memory transferPayload = abi.encodeWithSelector(bytes4(0xbeabacc8), param1, param2, param3);
bytes memory executePayload = abi.encodeWithSignature("execute(address,bytes)", transferContractAdr, transferPayload);
(bool success, bytes memory returnData) = address(executeContractAdr).call(executePayload);
require(success, "low-level call of function execute failed [transfer(address,address,uint256), param1, param2, param3]");
Example 2: Call function and let Solidity automatically calculate the function signature
Just replace
bytes memory transferPayload = abi.encodeWithSelector(bytes4(0xbeabacc8), param1, param2, param3);
with
bytes memory transferPayload = abi.encodeWithSignature("transfer(address,address,uint256)", param1, param2, param3);
note 1: Please consider which call (call, callcode, delegatecall, staticcall) will be appropriate for your scenario
note 2: Replace the require statement with an appropriate try-catch block
note 3: If you call a function in the same contract, you can use address(this)