We have around 100 users who belong to 3 different profiles. We know it is possible to do it via permissions sets. But is it possible to provide permission via public groups or roles...what is best recommended.
Permissions through public groups or roles denotes Record Level Visibility or Access Rights either that could be read-only or read-write.
Even record level access comes after having access to objects via profiles or permission sets.
Refer this diagram
So, for your use case it will be better to provide access through profiles if all the users of the same profiles want to get the same access.
Otherwise, if specific users out of 3 profiles need special access then create permission set and assign to those users.