The first thing about cards is that the implementation may change. As Fred Hebert wrote in, learn about some of the Erlang Chapter cards : βThe OTP team respects the old slogan: first make it work, and then do it beautifully, and only if you need to, do it quickly.β Therefore, it does not depend too much on this answer.
Currently, maps:without/2 implemented as follows:
without(Ks, M) when is_list(Ks), is_map(M) -> maps:from_list([{K,V}||{K,V} <- maps:to_list(M), not lists:member(K, Ks)]).
As you can see, it iterates over the whole map. It converts it to a list, deletes the keys, and converts them back to a card. Not very effective, but, as I said: this may change in the future.
The maps:remove/2 function is NIF, which means it is written in C and takes advantage of the internal representation. Speaking of this ... During Stockholm Erlang Factory 2013, Kenneth Lundin mentioned the internal representation of maps ( http://vimeo.com/69950294 ). In fact, there are two of them (slices from conversations with which I am associated).

This is for a small number of keys. In this view, a set of values ββhas a pointer to a set of keys, which means that if you change the value, but the key keys will be split. Keys are also sorted. The second, for large numbers of keys, is as follows:

So, this is a tree, which means that if, for example, you delete a key in the right subtree, your new card can split the entire left subtree. To get clearer information about immutable data structures, you can refer to wikipedia ErlangVM should transparently switch between these views as necessary.
To answer your question. If you want to delete one key, use maps:remove/2 , if you want to remove several keys, use maps:without/2 , because it would be cheaper to create a new map instead of managing the old one.