I am with you on the use of delegation.
However, you could take your example one step further and use dependency injection to fully decouple the two classes.
package Bar;
sub new {
my ($class, %args) = @_;
bless \%args, $class;
}
sub wonk {
my $self = shift;
$self->{_foo}->wonk(@_); # delegation!
}
package main;
use Bar;
use Foo;
my $bar = Bar->new(_foo => Foo->new());
Now Bar is fully independent of Foo (coupled only by the implied "interface" which consists of the wonk() method).
This also makes testing easier.