I don't think there are any best practices because it would depend on both your company structure as well as how your developers manage their code in SCM (gitflow, trunk, etc).
Lets start with the statements that seem to be in contradiction. I think quoted like that they do seem to tell a different story. But lets look at the start of the paragraph where the first quote came from.
When Terraform is used to manage larger systems, teams should use
multiple separate Terraform configurations that correspond with
suitable architectural boundaries within the system so that different
components can be managed separately and, if appropriate, by distinct
teams.
So it's saying that when you have multiple teams using the same terraform directory (aka configuration) then...
Workspaces alone are not a suitable tool for system decomposition, because each subsystem should have its own separate configuration and backend, and will thus have its own distinct set of workspaces.
Which makes sense. Each team will need different things from their workspace and since all the teams will be sharing workspaces then it kinda falls apart. So in conclusion, different directories and workspaces can be used to separate environments in Terraform but they have certain limitations. In the tutorial you linked, I think it's explained even better:
To separate environments with potential configuration differences, use
a directory structure. Use workspaces for environments that do not
greatly deviate from one another, to avoid duplicating your
configurations.
The second part of your question about recommendations can get somewhat complicated depending on what level of CICD and automation your company currently has. If your infra is small and the number of changes every month is pretty minimal then it's probably fine to just checkout the code, make the change and deploy it locally.
But if you are a large organization with 100's of changes a week, then you are probably going to want to automate the deployments. A common way of doing that is to trigger CICD on new PR's or changes to certain branches. From there you can have your CICD engine change workspaces based on the branch name. Or more commonly for older companies who used Terraform before workspaces existed, you can just set the state path to something like ${env}/tf.state
because that really has the same effect as just using workspaces.
I'm a Terraform and https://github.com/gruntwork-io/terratest/releases/tag/v0.28.5 contribtutor. I'm also the author of https://github.com/DontShaveTheYak/cf2tf and the https://github.com/DontShaveTheYak/terraform-module-template .