Groups are valuable when use appropriately. The thing you want to avoid doing is grouping people that you could easily otherwise lookup. If you want to find all of the contacts that a user (salesperson) is assigned to, just go to Lookup > Other Fields > Look in this Field: Record Manager.
Using groups in your database will not "slow down" any searches nor affect performance in any way.
An example of a "good" group is to group contacts that are all involved in a "project" together. If you are a real estate agent, for example, you might group together the buyer, seller, escrow officer, loan officer, pest inspection person, appraiser, and any other real estate agents involved in the transaction - this way you can easily communicate with all parties to the transaction.
An example of a "bad" group is grouping together everyone that wants to receive your newsletter. This, in my opinion, should be done using custom fields. A "newsletter" checkbox is something I've done in the past. You can then do a lookup for "newsletter" where the value = "yes" or "true".
As far as companies go - this is where ACT shows off its new relational database structure. Companies are used in conjunction with contacts. Each contact can be associated with multiple companies, but linked to only one. When you update company data in the company record (if they company changes phone numbers or addresses, etc.), you can automatically update all of your contacts information to reflect that with about two mouse clicks. Companies also offer the same functionality as groups, in that you can choose to mail merge to an entire company, assign an activity to an entire company, pull a report for a particular company, etc.
I hope this answers some questions!
~Melagan
______
"It's never too late to become what you might have been.