Думаю, узким местом служит синхронность самого VK API.
Для ускорения я бы взял готовую асинхронную обёртку и пробовал переписать на неё.
Глянь
здесь. У некоторых даже тутор для новичков прямо в github лежит.
По "красоте" кода:
- Лично мне глаза режет лесенка из if-ов.
Тут наглядно об этом. Если ещё короче - замени их обратными условиями и вложенность исчезнет.
- Во многих местах в конце функции
return None излишний. Если функция ничего не вернула, ты и так получишь None.