Hi,
In general the best way will depends on the requirement. As of my knowledge, using all above methods we can develop same kind of ALVs with all functionality.
But, using REUSE_ALV_GRID_DISPLAY is a traditional way to developing ALV. Whereas using Object oriented programming will have added advantage as data flows through objects.
And again in OOPS both CL_SALV_TABLE and CL_GUI_ALV_GRID can develop same ALVs. But when we are using Containers to display (like in case of editable ALVs) it is suggested to go for CL_GUI_ALV_GRID, whereas CL_SALV_TABLE for simple ALVs.
This is all as of my knowledge, I learnt from my seniors.
Regards,
Vijay