Writing data to SSISDB.Catalog.Executions
The question asks about inserting into catalog.executions. The entire catalog schema is just views over the internal schema tables which have security role checks in place.

If you look at the definition for catalog.create_execution after doing some permission checks, it will use an CLR proc to insert into internal.operations to generate an ID and then the actual insertion into internal.executions

-- Parameters
DECLARE
    @folder_name nvarchar(128) = (SELECT TOP 1 F.name FROM internal.folders AS F ORDER BY 1)
,   @project_name nvarchar(128) = (SELECT TOP 1 P.name FROM internal.folders AS F INNER JOIN internal.projects AS P ON P.folder_id = F.folder_id ORDER BY F.name)
,   @package_name nvarchar(260) = (SELECT TOP 1 PKG.name FROM internal.folders AS F INNER JOIN internal.projects AS P ON P.folder_id = F.folder_id INNER JOIN internal.packages AS PKG ON PKG.project_id = P.project_id ORDER BY F.name)
,   @reference_id bigint = NULL
,   @use32bitruntime bit = 0
,   @execution_id bigint; 

DECLARE @caller_name internal.adt_sname = (SELECT USER_NAME());
DECLARE @caller_sid internal.adt_sid = (SELECT USER_ID());
DECLARE @created_time datetimeoffset;
DECLARE @return_value int;
DECLARE @operation_id bigint;
DECLARE @result bit;
DECLARE @environment_id bigint;
DECLARE @environment_found bit;
DECLARE @environment_name nvarchar(128)
DECLARE @environment_folder_name nvarchar(128)
DECLARE @reference_type char(1)
DECLARE @version_id bigint

SET @created_time = SYSDATETIMEOFFSET();
SET @operation_id = -1;

INSERT INTO
internal.operations
(
    operation_type
,   created_time
,   object_type
,   object_id
,   object_name
,   status
,   start_time
,   end_time
,   caller_sid
,   caller_name
,   process_id
,   stopped_by_sid
,   stopped_by_name
,   operation_guid
,   server_name
,   machine_name
)
VALUES
(
    200
,   SYSDATETIMEOFFSET()  -- created_time - datetimeoffset
,   20
,   0
,   N'Demo'  -- object_name - nvarchar(260)
,   1  -- status - int
,   SYSDATETIMEOFFSET()  -- start_time - datetimeoffset
,   SYSDATETIMEOFFSET()  -- end_time - datetimeoffset
,   @caller_sid
,   @caller_name
,   0  -- process_id - int
,   NULL  -- stopped_by_sid - varbinary(85)
,   N''  -- stopped_by_name - nvarchar(128)
,   NULL  -- operation_guid - uniqueidentifier
,   @@SERVERNAME
,   @@SERVERNAME
)

SELECT
    @operation_id = SCOPE_IDENTITY();

INSERT into internal.executions
(
    execution_id
,   folder_name
,   project_name
,   package_name
,   reference_id
,   reference_type
,   environment_folder_name
,   environment_name
,   project_lsn
,   executed_as_sid
,   executed_as_name
,   use32bitruntime
)
VALUES 
(
    @operation_id
,   @folder_name
,   @project_name
,   @package_name
,   @reference_id
,   @reference_type
,   @environment_folder_name
,   @environment_name
,   @version_id
,   @caller_sid
,   @caller_name
,   @use32bitruntime
);

-- Look at what I've done
SELECT @operation_id AS OperationId;