You should be able to run your imperative Apex call from a getRecord adapter:

    import { LightningElement, api, wire } from 'lwc';
    import { getRecord } from 'lightning/uiRecordApi';
    import myMethod from '@salesforce/apex/MyClass.myMethod';
    
    export default class MyLWC extends LightningElement {
        @api recordId;
        
        @wire(getRecord, { recordId: '$recordId', fields: ['Account.Id'] })
        getRecordData({ error, data }) {
            if (this.recordId) {
                this.imperativeApexFunction();
            }
        }
    }

    imperativeApexFunction() {
        myMethod({ recordId: this.recordId })
            .then( result => {
                console.log(result);
                // Handle result
            })
            .catch( error => {
                console.log(error);
                // Handle error
            })
    }

The @wire getRecord adapter is intrinsically connected to the LDS, and will automatically run when a change is saved to the parent record, or a related child record, causing your Apex method to rerun as well

The recordId is not always set by default on page load, and it is helpful to include a check to see if there is a recordId before running your Apex method to prevent null errors