Намудрил-то, намудрил-то...
background_func() сделай асинхронной, run_in_executor() в ней нафиг не нужен, можно будет просто сделать await bot.send_message(...)
.
time.sleep(), соответственно, меняешь на await asyncio.sleep().
executor.start_polling() вызывай прямо в теле программы, без выкрутасов.
Для запуска функции при старте бота опиши её как
async def bot_startup(dp: Dispatcher):
и передай её в параметре on_startup при вызове start_polling().
А внутри bot_startup уже делай что нужно, например, asyncio.create_task(background_func())
.
Обрати внимание, без await - тогда background_func() будет работать параллельно боту.