Playing with the scene frame rate and scaling keys on the timeline is the best way to make errors down the line, and you are effectively designing a slow-motion animation instead of a real time one, you will see and animate things in a way that are seen and perceived very differently in real-time.
When it comes to handling performance:
1. Optimize the viewport and scene.
Make everything possible to lighten your viewport. Hide any unnecessary object to see your animation, disable any rendering setting that's not relevant (use your viewport in solid view, disable outline and wireframe overlays, ...), lower subdivision modifiers, disable textures, set your mesh objects to flat shading with no autosmooth, so on...
2. Optimize your rig itself.
If your animated objects are complex, make a "proxy", a low density version of it that uses no deformation. There's a nice guide by Pierrick Picaut here:
Do this to optimize your rigs' performances in Blender 👀
3. Last solution: render frequently.
If you still can't hit close to your final fps, then you need to do "playblast" to preview your animation. Playblasts are Viewport Render in Blender, it's a fast render of your viewport as is, and it's a fast way to see your animation as it will be. It's not ideal to be forced to use it, but if all the above isn't enough, it's the next best thing. Playblast often, no need for a high quality and resolution render, just one that renders fast so that you can see your animation in real time.
If you often need to playblast, there's a nice paid addon to help streamline this:
Playblast by carlosmu.